Skip to content

Commit c5f3502

Browse files
committed
release v1.0.7
1 parent 81c7b19 commit c5f3502

21 files changed

+537
-258
lines changed

.gitignore

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,5 @@ Temporary Items
8787
.apdisk
8888

8989
.idea/
90-
dist/
91-
coverage/
90+
#dist/
91+
#coverage/

coverage/badge.svg

Lines changed: 1 addition & 1 deletion
Loading

coverage/coverage-final.json

Lines changed: 3 additions & 3 deletions
Large diffs are not rendered by default.

coverage/coverage-summary.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{"total": {"lines":{"total":175,"covered":135,"skipped":0,"pct":77.14},"statements":{"total":189,"covered":137,"skipped":0,"pct":72.49},"functions":{"total":24,"covered":20,"skipped":0,"pct":83.33},"branches":{"total":87,"covered":46,"skipped":0,"pct":52.87}}
2-
,"/Users/donald/Project/browser-image-compression/lib/image-compression.js": {"lines":{"total":28,"covered":28,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":28,"covered":28,"skipped":0,"pct":100},"branches":{"total":14,"covered":13,"skipped":0,"pct":92.86}}
3-
,"/Users/donald/Project/browser-image-compression/lib/index.js": {"lines":{"total":29,"covered":25,"skipped":0,"pct":86.21},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":29,"covered":25,"skipped":0,"pct":86.21},"branches":{"total":19,"covered":13,"skipped":0,"pct":68.42}}
1+
{"total": {"lines":{"total":192,"covered":151,"skipped":0,"pct":78.65},"statements":{"total":206,"covered":153,"skipped":0,"pct":74.27},"functions":{"total":26,"covered":22,"skipped":0,"pct":84.62},"branches":{"total":90,"covered":48,"skipped":0,"pct":53.33}}
2+
,"/Users/donald/Project/browser-image-compression/lib/image-compression.js": {"lines":{"total":46,"covered":44,"skipped":0,"pct":95.65},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":46,"covered":44,"skipped":0,"pct":95.65},"branches":{"total":19,"covered":16,"skipped":0,"pct":84.21}}
3+
,"/Users/donald/Project/browser-image-compression/lib/index.js": {"lines":{"total":28,"covered":25,"skipped":0,"pct":89.29},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":28,"covered":25,"skipped":0,"pct":89.29},"branches":{"total":17,"covered":12,"skipped":0,"pct":70.59}}
44
,"/Users/donald/Project/browser-image-compression/lib/utils.js": {"lines":{"total":118,"covered":82,"skipped":0,"pct":69.49},"functions":{"total":22,"covered":18,"skipped":0,"pct":81.82},"statements":{"total":132,"covered":84,"skipped":0,"pct":63.64},"branches":{"total":54,"covered":20,"skipped":0,"pct":37.04}}
55
}

coverage/favicon.png

540 Bytes
Loading

coverage/image-compression.js.html

Lines changed: 119 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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">&nbsp;</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">&nbsp;</span>
170+
<span class="cline-any cline-neutral">&nbsp;</span>
171+
<span class="cline-any cline-neutral">&nbsp;</span>
172+
<span class="cline-any cline-neutral">&nbsp;</span>
173+
<span class="cline-any cline-neutral">&nbsp;</span>
174+
<span class="cline-any cline-neutral">&nbsp;</span>
175+
<span class="cline-any cline-neutral">&nbsp;</span>
176+
<span class="cline-any cline-neutral">&nbsp;</span>
177+
<span class="cline-any cline-neutral">&nbsp;</span>
137178
<span class="cline-any cline-neutral">&nbsp;</span>
138179
<span class="cline-any cline-neutral">&nbsp;</span>
139180
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -149,37 +190,58 @@ <h1><a href="index.html">All files</a> image-compression.js</h1>
149190
<span class="cline-any cline-neutral">&nbsp;</span>
150191
<span class="cline-any cline-neutral">&nbsp;</span>
151192
<span class="cline-any cline-neutral">&nbsp;</span>
193+
<span class="cline-any cline-yes">6x</span>
194+
<span class="cline-any cline-neutral">&nbsp;</span>
195+
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
152199
<span class="cline-any cline-neutral">&nbsp;</span>
153200
<span class="cline-any cline-neutral">&nbsp;</span>
154201
<span class="cline-any cline-neutral">&nbsp;</span>
155202
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
156206
<span class="cline-any cline-neutral">&nbsp;</span>
157207
<span class="cline-any cline-neutral">&nbsp;</span>
158208
<span class="cline-any cline-neutral">&nbsp;</span>
159209
<span class="cline-any cline-yes">6x</span>
160210
<span class="cline-any cline-neutral">&nbsp;</span>
161211
<span class="cline-any cline-yes">6x</span>
162212
<span class="cline-any cline-neutral">&nbsp;</span>
213+
<span class="cline-any cline-yes">6x</span>
214+
<span class="cline-any cline-neutral">&nbsp;</span>
215+
<span class="cline-any cline-neutral">&nbsp;</span>
216+
<span class="cline-any cline-yes">6x</span>
163217
<span class="cline-any cline-neutral">&nbsp;</span>
164218
<span class="cline-any cline-yes">6x</span>
165219
<span class="cline-any cline-neutral">&nbsp;</span>
166220
<span class="cline-any cline-neutral">&nbsp;</span>
167221
<span class="cline-any cline-yes">6x</span>
168222
<span class="cline-any cline-neutral">&nbsp;</span>
223+
<span class="cline-any cline-yes">6x</span>
169224
<span class="cline-any cline-neutral">&nbsp;</span>
225+
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
173231
<span class="cline-any cline-yes">6x</span>
174232
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
177236
<span class="cline-any cline-yes">6x</span>
178237
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
181241
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
183245
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
199261
<span class="cline-any cline-yes">6x</span>
200262
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
201266
<span class="cline-any cline-neutral">&nbsp;</span>
202267
<span class="cline-any cline-neutral">&nbsp;</span>
203268
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</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">&nbsp;</span>
212278
<span class="cline-any cline-neutral">&nbsp;</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&lt;File | Blob&gt;}
233300
*/
234301
export default async function compress (file, options) {
302+
let progress = 0
303+
&nbsp;
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+
&nbsp;
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+
&nbsp;
235318
let remainingTrials = options.maxIteration || 10
236319
&nbsp;
237320
const maxSizeByte = options.maxSizeMB * 1024 * 1024
321+
&nbsp;
322+
incProgress()
238323
&nbsp;
239324
// drawFileInCanvas
240325
let [img, origCanvas] = await drawFileInCanvas(file)
326+
&nbsp;
327+
incProgress()
241328
&nbsp;
242329
// handleMaxWidthOrHeight
243330
const maxWidthOrHeightFixedCanvas = handleMaxWidthOrHeight(origCanvas, options)
331+
&nbsp;
332+
incProgress()
244333
&nbsp;
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
&nbsp;
249340
let quality = 1
250341
&nbsp;
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 &lt;= maxSizeByte) {
254346
// no need to compress
347+
setProgress(100)
255348
return tempFile
256349
}
257350
&nbsp;
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-- &amp;&amp; compressedFile.size &gt; maxSizeByte) {
356+
while (remainingTrials-- &amp;&amp; currentSize &gt; 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
&nbsp;
273-
cleanupMemory(canvas)
368+
cleanupCanvasMemory(canvas)
274369
&nbsp;
275370
canvas = newCanvas
371+
&nbsp;
372+
currentSize = compressedFile.size
373+
setProgress(Math.min(99, Math.floor((originalSize - currentSize) / (originalSize - maxSizeByte) * 100)))
276374
}
277375
&nbsp;
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
&nbsp;
384+
setProgress(100)
286385
return compressedFile
287386
}
288387
&nbsp;</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

Comments
 (0)