Skip to content

Commit 7e9cba2

Browse files
committed
release 1.0.3
1 parent 77682f7 commit 7e9cba2

20 files changed

+554
-583
lines changed

CHANGELOG.md

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1+
## v1.0.3 (1 June 2019)
2+
* added: support for cordova project that uses cordova-plugin-file
3+
* optimized: follow image exif orientation even though image do not required to compress or resize
4+
* fixed: error may throw on iPhone Safari because of OffscreenCanvas cannot get 2d context
5+
* fixed: exif orientation do not work in some situation
6+
17
## v1.0.2 (8 Apr 2019)
2-
* fixing bug related to image orientation and squeezing
8+
* fixed: bug related to image orientation and squeezing
39

410
## v1.0.1 (8 Mar 2019)
5-
* fixing bug related to wrong image output resolution in some case
11+
* fixed: bug related to wrong image output resolution in some case
612

713
## v1.0.0 (6 Feb 2019)
814
* breaking change: change "imageCompression" function signature
9-
* use of OffscreenCanvas when support, fallback to document.createElement('canvas')
10-
* use createImageBitmap when support, fallback to FileReader readAsDataURL
11-
* add web worker support
12-
* follows image exif orientation
15+
* optimized: use of OffscreenCanvas when support, fallback to document.createElement('canvas')
16+
* optimized: use createImageBitmap when support, fallback to FileReader readAsDataURL
17+
* added: support web worker
18+
* added: follows image exif orientation

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ yarn add browser-image-compression
1818
```
1919
or use a CDN like [delivrjs]:
2020
```
21-
https://cdn.jsdelivr.net/npm/[email protected].2/dist/browser-image-compression.js
21+
https://cdn.jsdelivr.net/npm/[email protected].3/dist/browser-image-compression.js
2222
or
2323
https://cdn.jsdelivr.net/npm/browser-image-compression@latest/dist/browser-image-compression.js
2424
```

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: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{"total": {"lines":{"total":163,"covered":125,"skipped":0,"pct":76.69},"statements":{"total":177,"covered":127,"skipped":0,"pct":71.75},"functions":{"total":21,"covered":18,"skipped":0,"pct":85.71},"branches":{"total":80,"covered":45,"skipped":0,"pct":56.25}}
2-
,"/Users/donald/Project/browser-image-compression/lib/image-compression.js": {"lines":{"total":31,"covered":29,"skipped":0,"pct":93.55},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":31,"covered":29,"skipped":0,"pct":93.55},"branches":{"total":18,"covered":15,"skipped":0,"pct":83.33}}
3-
,"/Users/donald/Project/browser-image-compression/lib/index.js": {"lines":{"total":25,"covered":22,"skipped":0,"pct":88},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":25,"covered":22,"skipped":0,"pct":88},"branches":{"total":17,"covered":12,"skipped":0,"pct":70.59}}
4-
,"/Users/donald/Project/browser-image-compression/lib/utils.js": {"lines":{"total":107,"covered":74,"skipped":0,"pct":69.16},"functions":{"total":19,"covered":16,"skipped":0,"pct":84.21},"statements":{"total":121,"covered":76,"skipped":0,"pct":62.81},"branches":{"total":45,"covered":18,"skipped":0,"pct":40}}
1+
{"total": {"lines":{"total":157,"covered":120,"skipped":0,"pct":76.43},"statements":{"total":171,"covered":122,"skipped":0,"pct":71.35},"functions":{"total":22,"covered":19,"skipped":0,"pct":86.36},"branches":{"total":73,"covered":40,"skipped":0,"pct":54.79}}
2+
,"/Users/donald/Project/browser-image-compression/lib/image-compression.js": {"lines":{"total":21,"covered":21,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":21,"covered":21,"skipped":0,"pct":100},"branches":{"total":10,"covered":9,"skipped":0,"pct":90}}
3+
,"/Users/donald/Project/browser-image-compression/lib/index.js": {"lines":{"total":26,"covered":22,"skipped":0,"pct":84.62},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":26,"covered":22,"skipped":0,"pct":84.62},"branches":{"total":17,"covered":12,"skipped":0,"pct":70.59}}
4+
,"/Users/donald/Project/browser-image-compression/lib/utils.js": {"lines":{"total":110,"covered":77,"skipped":0,"pct":70},"functions":{"total":20,"covered":17,"skipped":0,"pct":85},"statements":{"total":124,"covered":79,"skipped":0,"pct":63.71},"branches":{"total":46,"covered":19,"skipped":0,"pct":41.3}}
55
}

coverage/image-compression.js.html

Lines changed: 38 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,24 @@ <h1>
2020
</h1>
2121
<div class='clearfix'>
2222
<div class='fl pad1y space-right2'>
23-
<span class="strong">93.55% </span>
23+
<span class="strong">100% </span>
2424
<span class="quiet">Statements</span>
25-
<span class='fraction'>29/31</span>
25+
<span class='fraction'>21/21</span>
2626
</div>
2727
<div class='fl pad1y space-right2'>
28-
<span class="strong">83.33% </span>
28+
<span class="strong">90% </span>
2929
<span class="quiet">Branches</span>
30-
<span class='fraction'>15/18</span>
30+
<span class='fraction'>9/10</span>
3131
</div>
3232
<div class='fl pad1y space-right2'>
3333
<span class="strong">100% </span>
3434
<span class="quiet">Functions</span>
3535
<span class='fraction'>1/1</span>
3636
</div>
3737
<div class='fl pad1y space-right2'>
38-
<span class="strong">93.55% </span>
38+
<span class="strong">100% </span>
3939
<span class="quiet">Lines</span>
40-
<span class='fraction'>29/31</span>
40+
<span class='fraction'>21/21</span>
4141
</div>
4242
</div>
4343
<p class="quiet">
@@ -100,23 +100,7 @@ <h1>
100100
<a name='L52'></a><a href='#L52'>52</a>
101101
<a name='L53'></a><a href='#L53'>53</a>
102102
<a name='L54'></a><a href='#L54'>54</a>
103-
<a name='L55'></a><a href='#L55'>55</a>
104-
<a name='L56'></a><a href='#L56'>56</a>
105-
<a name='L57'></a><a href='#L57'>57</a>
106-
<a name='L58'></a><a href='#L58'>58</a>
107-
<a name='L59'></a><a href='#L59'>59</a>
108-
<a name='L60'></a><a href='#L60'>60</a>
109-
<a name='L61'></a><a href='#L61'>61</a>
110-
<a name='L62'></a><a href='#L62'>62</a>
111-
<a name='L63'></a><a href='#L63'>63</a>
112-
<a name='L64'></a><a href='#L64'>64</a>
113-
<a name='L65'></a><a href='#L65'>65</a>
114-
<a name='L66'></a><a href='#L66'>66</a>
115-
<a name='L67'></a><a href='#L67'>67</a>
116-
<a name='L68'></a><a href='#L68'>68</a>
117-
<a name='L69'></a><a href='#L69'>69</a>
118-
<a name='L70'></a><a href='#L70'>70</a>
119-
<a name='L71'></a><a href='#L71'>71</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
103+
<a name='L55'></a><a href='#L55'>55</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
120104
<span class="cline-any cline-neutral">&nbsp;</span>
121105
<span class="cline-any cline-neutral">&nbsp;</span>
122106
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -136,57 +120,41 @@ <h1>
136120
<span class="cline-any cline-neutral">&nbsp;</span>
137121
<span class="cline-any cline-neutral">&nbsp;</span>
138122
<span class="cline-any cline-yes">6x</span>
139-
<span class="cline-any cline-no">&nbsp;</span>
140-
<span class="cline-any cline-neutral">&nbsp;</span>
141-
<span class="cline-any cline-neutral">&nbsp;</span>
142123
<span class="cline-any cline-neutral">&nbsp;</span>
143124
<span class="cline-any cline-neutral">&nbsp;</span>
144-
<span class="cline-any cline-neutral">&nbsp;</span>
145-
<span class="cline-any cline-yes">6x</span>
146-
<span class="cline-any cline-yes">6x</span>
147125
<span class="cline-any cline-yes">6x</span>
148126
<span class="cline-any cline-neutral">&nbsp;</span>
149127
<span class="cline-any cline-neutral">&nbsp;</span>
150128
<span class="cline-any cline-yes">6x</span>
151129
<span class="cline-any cline-yes">6x</span>
152-
<span class="cline-any cline-yes">6x</span>
153130
<span class="cline-any cline-neutral">&nbsp;</span>
154-
<span class="cline-any cline-neutral">&nbsp;</span>
155-
<span class="cline-any cline-yes">6x</span>
156131
<span class="cline-any cline-yes">6x</span>
157132
<span class="cline-any cline-neutral">&nbsp;</span>
158-
<span class="cline-any cline-neutral">&nbsp;</span>
159133
<span class="cline-any cline-yes">6x</span>
160-
<span class="cline-any cline-no">&nbsp;</span>
161-
<span class="cline-any cline-neutral">&nbsp;</span>
162134
<span class="cline-any cline-neutral">&nbsp;</span>
163135
<span class="cline-any cline-yes">6x</span>
164-
<span class="cline-any cline-yes">6x</span>
165-
<span class="cline-any cline-yes">6x</span>
166-
<span class="cline-any cline-yes">3x</span>
167-
<span class="cline-any cline-yes">5x</span>
168-
<span class="cline-any cline-yes">5x</span>
169-
<span class="cline-any cline-neutral">&nbsp;</span>
170-
<span class="cline-any cline-yes">5x</span>
171-
<span class="cline-any cline-yes">5x</span>
172136
<span class="cline-any cline-neutral">&nbsp;</span>
173-
<span class="cline-any cline-yes">5x</span>
137+
<span class="cline-any cline-yes">4x</span>
174138
<span class="cline-any cline-neutral">&nbsp;</span>
175139
<span class="cline-any cline-neutral">&nbsp;</span>
176-
<span class="cline-any cline-yes">3x</span>
177140
<span class="cline-any cline-yes">2x</span>
178141
<span class="cline-any cline-yes">2x</span>
142+
<span class="cline-any cline-yes">7x</span>
143+
<span class="cline-any cline-yes">7x</span>
144+
<span class="cline-any cline-yes">7x</span>
179145
<span class="cline-any cline-neutral">&nbsp;</span>
180-
<span class="cline-any cline-yes">2x</span>
181-
<span class="cline-any cline-yes">2x</span>
146+
<span class="cline-any cline-yes">7x</span>
182147
<span class="cline-any cline-neutral">&nbsp;</span>
183-
<span class="cline-any cline-yes">2x</span>
148+
<span class="cline-any cline-yes">7x</span>
184149
<span class="cline-any cline-yes">2x</span>
185150
<span class="cline-any cline-neutral">&nbsp;</span>
151+
<span class="cline-any cline-yes">7x</span>
186152
<span class="cline-any cline-neutral">&nbsp;</span>
153+
<span class="cline-any cline-yes">7x</span>
187154
<span class="cline-any cline-neutral">&nbsp;</span>
188-
<span class="cline-any cline-yes">6x</span>
189-
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { canvasToFile, drawFileInCanvas, followExifOrientation, getExifOrientation, handleMaxWidthOrHeight } from './utils'
155+
<span class="cline-any cline-neutral">&nbsp;</span>
156+
<span class="cline-any cline-yes">2x</span>
157+
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { canvasToFile, drawFileInCanvas, followExifOrientation, getExifOrientation, handleMaxWidthOrHeight, getNewCanvasAndCtx } from './utils'
190158
&nbsp;
191159
/**
192160
* Compress an image file.
@@ -203,56 +171,40 @@ <h1>
203171
let remainingTrials = options.maxIteration || 10
204172
&nbsp;
205173
const maxSizeByte = options.maxSizeMB * 1024 * 1024
206-
&nbsp;
207-
// no need to compress or resize
208-
<span class="missing-if-branch" title="if path not taken" >I</span>if (file.size &lt;= maxSizeByte &amp;&amp; typeof options.maxWidthOrHeight === 'undefined') {
209-
<span class="cstat-no" title="statement not covered" > return file</span>
210-
}
211-
&nbsp;
212-
let img, canvas, isResized
213174
&nbsp;
214175
// drawFileInCanvas
215-
let temp = await drawFileInCanvas(file)
216-
img = temp[0]
217-
canvas = temp[1]
176+
let [img, canvas] = await drawFileInCanvas(file)
218177
&nbsp;
219178
// handleMaxWidthOrHeight
220-
let temp2 = handleMaxWidthOrHeight(img, canvas, options)
221-
canvas = temp2[0]
222-
isResized = temp2[1]
179+
canvas = handleMaxWidthOrHeight(canvas, options)
223180
&nbsp;
224181
// exifOrientation
225182
options.exifOrientation = options.exifOrientation || <span class="branch-1 cbranch-no" title="branch not covered" >await getExifOrientation(file)</span>
226-
canvas = followExifOrientation(img, canvas, options.exifOrientation)
227-
&nbsp;
228-
// no need to compress or resize
229-
<span class="missing-if-branch" title="if path not taken" >I</span>if (file.size &lt;= maxSizeByte &amp;&amp; !isResized) {
230-
<span class="cstat-no" title="statement not covered" > return file</span>
231-
}
183+
canvas = followExifOrientation(canvas, options.exifOrientation)
232184
&nbsp;
233185
let quality = 1
234-
let compressedFile = await canvasToFile(canvas, file.type, file.name, file.lastModified, quality)
235-
if (file.type === 'image/png') {
236-
while (remainingTrials-- &amp;&amp; compressedFile.size &gt; maxSizeByte) {
237-
canvas.width *= 0.9
238-
canvas.height *= 0.9
239186
&nbsp;
240-
const ctx = canvas.getContext('2d')
241-
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
187+
let tempFile = await canvasToFile(canvas, file.type, file.name, file.lastModified, quality)
188+
// check if we need to compress or resize
189+
if (tempFile.size &lt;= maxSizeByte) {
190+
// no need to compress
191+
return tempFile
192+
}
242193
&nbsp;
243-
compressedFile = await canvasToFile(canvas, file.type, file.name, file.lastModified, quality)
244-
}
245-
} else { // if (file.type === 'image/jpeg') {
246-
while (remainingTrials-- &amp;&amp; compressedFile.size &gt; maxSizeByte) {
247-
canvas.width *= 0.9
248-
canvas.height *= 0.9
194+
let compressedFile = tempFile
195+
while (remainingTrials-- &amp;&amp; compressedFile.size &gt; maxSizeByte) {
196+
const newWidth = canvas.width * 0.9
197+
const newHeight = canvas.height * 0.9
198+
const [newCanvas, ctx] = getNewCanvasAndCtx(newWidth, newHeight)
249199
&nbsp;
250-
const ctx = canvas.getContext('2d')
251-
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
200+
ctx.drawImage(img, 0, 0, newWidth, newHeight)
252201
&nbsp;
202+
if (file.type === 'image/jpeg') {
253203
quality *= 0.9
254-
compressedFile = await canvasToFile(canvas, file.type, file.name, file.lastModified, quality)
255204
}
205+
compressedFile = await canvasToFile(newCanvas, file.type, file.name, file.lastModified, quality)
206+
&nbsp;
207+
canvas = newCanvas
256208
}
257209
&nbsp;
258210
return compressedFile
@@ -262,7 +214,7 @@ <h1>
262214
</div><!-- /wrapper -->
263215
<div class='footer quiet pad2 space-top1 center small'>
264216
Code coverage
265-
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Fri May 31 2019 16:31:31 GMT+0800 (Hong Kong Standard Time)
217+
generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Jun 01 2019 02:19:15 GMT+0800 (Hong Kong Standard Time)
266218
</div>
267219
</div>
268220
<script src="prettify.js"></script>

0 commit comments

Comments
 (0)