@@ -23,30 +23,30 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
2323 < div class ='clearfix '>
2424
2525 < div class ='fl pad1y space-right2 '>
26- < span class ="strong "> 100 % </ span >
26+ < span class ="strong "> 95.65 % </ span >
2727 < span class ="quiet "> Statements</ span >
28- < span class ='fraction '> 28/28 </ span >
28+ < span class ='fraction '> 44/46 </ span >
2929 </ div >
3030
3131
3232 < div class ='fl pad1y space-right2 '>
33- < span class ="strong "> 92.86 % </ span >
33+ < span class ="strong "> 84.21 % </ span >
3434 < span class ="quiet "> Branches</ span >
35- < span class ='fraction '> 13/14 </ span >
35+ < span class ='fraction '> 16/19 </ span >
3636 </ div >
3737
3838
3939 < div class ='fl pad1y space-right2 '>
4040 < span class ="strong "> 100% </ span >
4141 < span class ="quiet "> Functions</ span >
42- < span class ='fraction '> 1/1 </ span >
42+ < span class ='fraction '> 3/3 </ span >
4343 </ div >
4444
4545
4646 < div class ='fl pad1y space-right2 '>
47- < span class ="strong "> 100 % </ span >
47+ < span class ="strong "> 95.65 % </ span >
4848 < span class ="quiet "> Lines</ span >
49- < span class ='fraction '> 28/28 </ span >
49+ < span class ='fraction '> 44/46 </ span >
5050 </ div >
5151
5252
@@ -133,7 +133,48 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
133133< a name ='L74 '> </ a > < a href ='#L74 '> 74</ a >
134134< a name ='L75 '> </ a > < a href ='#L75 '> 75</ a >
135135< a name ='L76 '> </ a > < a href ='#L76 '> 76</ a >
136- < a name ='L77 '> </ a > < a href ='#L77 '> 77</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-neutral "> </ span >
136+ < a name ='L77 '> </ a > < a href ='#L77 '> 77</ a >
137+ < a name ='L78 '> </ a > < a href ='#L78 '> 78</ a >
138+ < a name ='L79 '> </ a > < a href ='#L79 '> 79</ a >
139+ < a name ='L80 '> </ a > < a href ='#L80 '> 80</ a >
140+ < a name ='L81 '> </ a > < a href ='#L81 '> 81</ a >
141+ < a name ='L82 '> </ a > < a href ='#L82 '> 82</ a >
142+ < a name ='L83 '> </ a > < a href ='#L83 '> 83</ a >
143+ < a name ='L84 '> </ a > < a href ='#L84 '> 84</ a >
144+ < a name ='L85 '> </ a > < a href ='#L85 '> 85</ a >
145+ < a name ='L86 '> </ a > < a href ='#L86 '> 86</ a >
146+ < a name ='L87 '> </ a > < a href ='#L87 '> 87</ a >
147+ < a name ='L88 '> </ a > < a href ='#L88 '> 88</ a >
148+ < a name ='L89 '> </ a > < a href ='#L89 '> 89</ a >
149+ < a name ='L90 '> </ a > < a href ='#L90 '> 90</ a >
150+ < a name ='L91 '> </ a > < a href ='#L91 '> 91</ a >
151+ < a name ='L92 '> </ a > < a href ='#L92 '> 92</ a >
152+ < a name ='L93 '> </ a > < a href ='#L93 '> 93</ a >
153+ < a name ='L94 '> </ a > < a href ='#L94 '> 94</ a >
154+ < a name ='L95 '> </ a > < a href ='#L95 '> 95</ a >
155+ < a name ='L96 '> </ a > < a href ='#L96 '> 96</ a >
156+ < a name ='L97 '> </ a > < a href ='#L97 '> 97</ a >
157+ < a name ='L98 '> </ a > < a href ='#L98 '> 98</ a >
158+ < a name ='L99 '> </ a > < a href ='#L99 '> 99</ a >
159+ < a name ='L100 '> </ a > < a href ='#L100 '> 100</ a >
160+ < a name ='L101 '> </ a > < a href ='#L101 '> 101</ a >
161+ < a name ='L102 '> </ a > < a href ='#L102 '> 102</ a >
162+ < a name ='L103 '> </ a > < a href ='#L103 '> 103</ a >
163+ < a name ='L104 '> </ a > < a href ='#L104 '> 104</ a >
164+ < a name ='L105 '> </ a > < a href ='#L105 '> 105</ a >
165+ < a name ='L106 '> </ a > < a href ='#L106 '> 106</ a >
166+ < a name ='L107 '> </ a > < a href ='#L107 '> 107</ a >
167+ < a name ='L108 '> </ a > < a href ='#L108 '> 108</ a >
168+ < a name ='L109 '> </ a > < a href ='#L109 '> 109</ a >
169+ < a name ='L110 '> </ a > < a href ='#L110 '> 110</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-neutral "> </ span >
170+ < span class ="cline-any cline-neutral "> </ span >
171+ < span class ="cline-any cline-neutral "> </ span >
172+ < span class ="cline-any cline-neutral "> </ span >
173+ < span class ="cline-any cline-neutral "> </ span >
174+ < span class ="cline-any cline-neutral "> </ span >
175+ < span class ="cline-any cline-neutral "> </ span >
176+ < span class ="cline-any cline-neutral "> </ span >
177+ < span class ="cline-any cline-neutral "> </ span >
137178< span class ="cline-any cline-neutral "> </ span >
138179< span class ="cline-any cline-neutral "> </ span >
139180< span class ="cline-any cline-neutral "> </ span >
@@ -149,37 +190,58 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
149190< span class ="cline-any cline-neutral "> </ span >
150191< span class ="cline-any cline-neutral "> </ span >
151192< span class ="cline-any cline-neutral "> </ span >
193+ < span class ="cline-any cline-yes "> 6x</ span >
194+ < span class ="cline-any cline-neutral "> </ span >
195+ < span class ="cline-any cline-neutral "> </ span >
196+ < span class ="cline-any cline-yes "> 36x</ span >
197+ < span class ="cline-any cline-yes "> 36x</ span >
198+ < span class ="cline-any cline-no "> </ span >
152199< span class ="cline-any cline-neutral "> </ span >
153200< span class ="cline-any cline-neutral "> </ span >
154201< span class ="cline-any cline-neutral "> </ span >
155202< span class ="cline-any cline-neutral "> </ span >
203+ < span class ="cline-any cline-yes "> 12x</ span >
204+ < span class ="cline-any cline-yes "> 12x</ span >
205+ < span class ="cline-any cline-no "> </ span >
156206< span class ="cline-any cline-neutral "> </ span >
157207< span class ="cline-any cline-neutral "> </ span >
158208< span class ="cline-any cline-neutral "> </ span >
159209< span class ="cline-any cline-yes "> 6x</ span >
160210< span class ="cline-any cline-neutral "> </ span >
161211< span class ="cline-any cline-yes "> 6x</ span >
162212< span class ="cline-any cline-neutral "> </ span >
213+ < span class ="cline-any cline-yes "> 6x</ span >
214+ < span class ="cline-any cline-neutral "> </ span >
215+ < span class ="cline-any cline-neutral "> </ span >
216+ < span class ="cline-any cline-yes "> 6x</ span >
163217< span class ="cline-any cline-neutral "> </ span >
164218< span class ="cline-any cline-yes "> 6x</ span >
165219< span class ="cline-any cline-neutral "> </ span >
166220< span class ="cline-any cline-neutral "> </ span >
167221< span class ="cline-any cline-yes "> 6x</ span >
168222< span class ="cline-any cline-neutral "> </ span >
223+ < span class ="cline-any cline-yes "> 6x</ span >
169224< span class ="cline-any cline-neutral "> </ span >
225+ < span class ="cline-any cline-neutral "> </ span >
226+ < span class ="cline-any cline-yes "> 6x</ span >
227+ < span class ="cline-any cline-yes "> 6x</ span >
170228< span class ="cline-any cline-yes "> 6x</ span >
171229< span class ="cline-any cline-yes "> 6x</ span >
172230< span class ="cline-any cline-neutral "> </ span >
173231< span class ="cline-any cline-yes "> 6x</ span >
174232< span class ="cline-any cline-neutral "> </ span >
175233< span class ="cline-any cline-yes "> 6x</ span >
234+ < span class ="cline-any cline-yes "> 6x</ span >
176235< span class ="cline-any cline-neutral "> </ span >
177236< span class ="cline-any cline-yes "> 6x</ span >
178237< span class ="cline-any cline-neutral "> </ span >
179238< span class ="cline-any cline-yes "> 4x</ span >
239+ < span class ="cline-any cline-yes "> 4x</ span >
180240< span class ="cline-any cline-neutral "> </ span >
181241< span class ="cline-any cline-neutral "> </ span >
182242< span class ="cline-any cline-yes "> 2x</ span >
243+ < span class ="cline-any cline-yes "> 2x</ span >
244+ < span class ="cline-any cline-neutral "> </ span >
183245< span class ="cline-any cline-neutral "> </ span >
184246< span class ="cline-any cline-yes "> 2x</ span >
185247< span class ="cline-any cline-yes "> 2x</ span >
@@ -198,6 +260,9 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
198260< span class ="cline-any cline-neutral "> </ span >
199261< span class ="cline-any cline-yes "> 6x</ span >
200262< span class ="cline-any cline-neutral "> </ span >
263+ < span class ="cline-any cline-yes "> 6x</ span >
264+ < span class ="cline-any cline-yes "> 6x</ span >
265+ < span class ="cline-any cline-neutral "> </ span >
201266< span class ="cline-any cline-neutral "> </ span >
202267< span class ="cline-any cline-neutral "> </ span >
203268< span class ="cline-any cline-neutral "> </ span >
@@ -208,10 +273,11 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
208273< span class ="cline-any cline-yes "> 2x</ span >
209274< span class ="cline-any cline-neutral "> </ span >
210275< span class ="cline-any cline-yes "> 2x</ span >
276+ < span class ="cline-any cline-yes "> 2x</ span >
211277< span class ="cline-any cline-neutral "> </ span >
212278< span class ="cline-any cline-neutral "> </ span > </ td > < td class ="text "> < pre class ="prettyprint lang-js "> import {
213279 canvasToFile,
214- cleanupMemory ,
280+ cleanupCanvasMemory ,
215281 drawFileInCanvas,
216282 followExifOrientation,
217283 getExifOrientation,
@@ -227,38 +293,67 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
227293 * @param {number} [options.maxSizeMB=Number.POSITIVE_INFINITY]
228294 * @param {number} [options.maxWidthOrHeight=undefined]
229295 * @param {number} [options.maxIteration=10]
230- * @param {number} [options.exifOrientation=] - default to be the exif orientation from the image file
231- * @param {number} [options.fileType=undefined] - default to be the original mime type from the image file
296+ * @param {number} [options.exifOrientation] - default to be the exif orientation from the image file
297+ * @param {Function} [options.onProgress] - a function takes one progress argument (progress from 0 to 100)
298+ * @param {string} [options.fileType] - default to be the original mime type from the image file
232299 * @returns {Promise<File | Blob>}
233300 */
234301export default async function compress (file, options) {
302+ let progress = 0
303+
304+ function incProgress (inc = 5) {
305+ progress += inc
306+ < span class ="missing-if-branch " title ="if path not taken " > I</ span > if (typeof options.onProgress === 'function') {
307+ < span class ="cstat-no " title ="statement not covered " > options.onProgress(Math.min(progress, 100))</ span >
308+ }
309+ }
310+
311+ function setProgress (p) {
312+ progress = Math.min(Math.max(p, progress), 100)
313+ < span class ="missing-if-branch " title ="if path not taken " > I</ span > if (typeof options.onProgress === 'function') {
314+ < span class ="cstat-no " title ="statement not covered " > options.onProgress(progress)</ span >
315+ }
316+ }
317+
235318 let remainingTrials = options.maxIteration || 10
236319
237320 const maxSizeByte = options.maxSizeMB * 1024 * 1024
321+
322+ incProgress()
238323
239324 // drawFileInCanvas
240325 let [img, origCanvas] = await drawFileInCanvas(file)
326+
327+ incProgress()
241328
242329 // handleMaxWidthOrHeight
243330 const maxWidthOrHeightFixedCanvas = handleMaxWidthOrHeight(origCanvas, options)
331+
332+ incProgress()
244333
245334 // exifOrientation
246335 options.exifOrientation = options.exifOrientation || < span class ="branch-1 cbranch-no " title ="branch not covered " > await getExifOrientation(file)</ span >
336+ incProgress()
247337 const orientationFixedCanvas = followExifOrientation(maxWidthOrHeightFixedCanvas, options.exifOrientation)
338+ incProgress()
248339
249340 let quality = 1
250341
251342 let tempFile = await canvasToFile(orientationFixedCanvas, options.fileType || file.type, file.name, file.lastModified, quality)
343+ incProgress()
252344 // check if we need to compress or resize
253345 if (tempFile.size <= maxSizeByte) {
254346 // no need to compress
347+ setProgress(100)
255348 return tempFile
256349 }
257350
258- let compressedFile = tempFile
351+ const originalSize = tempFile.size
352+ let currentSize = originalSize
353+ let compressedFile
259354 let newCanvas, ctx
260355 let canvas = orientationFixedCanvas
261- while (remainingTrials-- && compressedFile.size > maxSizeByte) {
356+ while (remainingTrials-- && currentSize > maxSizeByte) {
262357 const newWidth = canvas.width * 0.9
263358 const newHeight = canvas.height * 0.9;
264359 [newCanvas, ctx] = getNewCanvasAndCtx(newWidth, newHeight)
@@ -270,19 +365,23 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
270365 }
271366 compressedFile = await canvasToFile(newCanvas, options.fileType || file.type, file.name, file.lastModified, quality)
272367
273- cleanupMemory (canvas)
368+ cleanupCanvasMemory (canvas)
274369
275370 canvas = newCanvas
371+
372+ currentSize = compressedFile.size
373+ setProgress(Math.min(99, Math.floor((originalSize - currentSize) / (originalSize - maxSizeByte) * 100)))
276374 }
277375
278376 // garbage clean canvas for safari
279377 // ref: https://bugs.webkit.org/show_bug.cgi?id=195325
280- cleanupMemory (canvas)
281- cleanupMemory (newCanvas)
282- cleanupMemory (maxWidthOrHeightFixedCanvas)
283- cleanupMemory (orientationFixedCanvas)
284- cleanupMemory (origCanvas)
378+ cleanupCanvasMemory (canvas)
379+ cleanupCanvasMemory (newCanvas)
380+ cleanupCanvasMemory (maxWidthOrHeightFixedCanvas)
381+ cleanupCanvasMemory (orientationFixedCanvas)
382+ cleanupCanvasMemory (origCanvas)
285383
384+ setProgress(100)
286385 return compressedFile
287386}
288387 </ pre > </ td > </ tr > </ table > </ pre >
@@ -292,7 +391,7 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
292391 < div class ='footer quiet pad2 space-top1 center small '>
293392 Code coverage generated by
294393 < a href ="https://istanbul.js.org/ " target ="_blank "> istanbul</ a >
295- at Sun Mar 15 2020 02:33:08 GMT+0800 (Hong Kong Standard Time)
394+ at Mon Mar 16 2020 12:52:28 GMT+0800 (Hong Kong Standard Time)
296395 </ div >
297396 </ div >
298397 < script src ="prettify.js "> </ script >
0 commit comments