Skip to content

Commit ccf0995

Browse files
authored
Merge pull request #125 from Donaldcwl/dev
v1.0.17
2 parents fdf2f4c + 16ee16a commit ccf0995

File tree

11 files changed

+54
-34
lines changed

11 files changed

+54
-34
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## v1.0.17 (15 Nov 2021)
2+
* feature: apply white background to transparent PNG > JPG conversion if options.fileType is image/jpeg or image/jpg [#119](https://github.com/Donaldcwl/browser-image-compression/issues/119)
3+
* fixed: Fixed image cropped on Safari [#118](https://github.com/Donaldcwl/browser-image-compression/issues/118)
14
## v1.0.16 (26 Sep 2021)
25
* fixed: Fixed output white picture on iOS Safari for large image because of canvas max size [#116](https://github.com/Donaldcwl/browser-image-compression/issues/116)
36
* fixed: Fixed wrong image orientation on iOS device [#118](https://github.com/Donaldcwl/browser-image-compression/issues/118)

README.md

Lines changed: 5 additions & 5 deletions
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].16/dist/browser-image-compression.js
21+
https://cdn.jsdelivr.net/npm/[email protected].17/dist/browser-image-compression.js
2222
or
2323
https://cdn.jsdelivr.net/npm/browser-image-compression@latest/dist/browser-image-compression.js
2424
```
@@ -42,14 +42,14 @@ or
4242

4343
#### In html file ####
4444
```html
45-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected].16/dist/browser-image-compression.js"></script>
45+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected].17/dist/browser-image-compression.js"></script>
4646
```
4747

4848
## API ##
4949
### Main function ###
5050
```javascript
5151
// you should provide one of maxSizeMB, maxWidthOrHeight in the options
52-
const options = {
52+
const options: Options = {
5353
maxSizeMB: number, // (default: Number.POSITIVE_INFINITY)
5454
maxWidthOrHeight: number, // compressedFile will scale down by ratio to a point that width or height is smaller than maxWidthOrHeight (default: undefined)
5555
// but, automatically reduce the size to smaller than the maximum Canvas size supported by each browser.
@@ -64,7 +64,7 @@ const options = {
6464
initialQuality: number // optional, initial quality value between 0 and 1 (default: 1)
6565
}
6666

67-
imageCompression(file: File, options): Promise<File>
67+
imageCompression(file: File, options: Options): Promise<File>
6868
```
6969

7070
#### Caveat ####
@@ -79,7 +79,7 @@ imageCompression.getDataUrlFromFile(file: File): Promise<base64 encoded string>
7979
imageCompression.getFilefromDataUrl(dataUrl: string, filename: string, lastModified?: number): Promise<File>
8080
imageCompression.loadImage(url: string): Promise<HTMLImageElement>
8181
imageCompression.drawImageInCanvas(img: HTMLImageElement, fileType?: string): HTMLCanvasElement | OffscreenCanvas
82-
imageCompression.drawFileInCanvas(file: File): Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement | OffscreenCanvas]>
82+
imageCompression.drawFileInCanvas(file: File, options?: Options): Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement | OffscreenCanvas]>
8383
imageCompression.canvasToFile(canvas: HTMLCanvasElement | OffscreenCanvas, fileType: string, fileName: string, fileLastModified: number, quality?: number): Promise<File>
8484
imageCompression.getExifOrientation(file: File): Promise<number> // based on https://stackoverflow.com/a/32490603/10395024
8585
```

example-express-server/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ yarn dev
1515
## Sample frontend HTML
1616
```html
1717
<script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script>
18-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected].16/dist/browser-image-compression.js"></script>
18+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected].17/dist/browser-image-compression.js"></script>
1919
<input type="file" accept="image/*" onchange="compressImage(event);">
2020
<script>
2121
function compressImage (event) {

example/basic.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
</style>
5252

5353

54-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected].16/dist/browser-image-compression.js"></script>
54+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected].17/dist/browser-image-compression.js"></script>
5555
<script>
5656
document.querySelector('#version').innerHTML = imageCompression.version
5757
function compressImage (event, useWebWorker) {

lib/config/browser-name.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export default {
2+
CHROME: 'CHROME',
3+
FIREFOX: 'FIREFOX',
4+
DESKTOP_SAFARI: 'DESKTOP_SAFARI',
5+
IE: 'IE',
6+
MOBILE_SAFARI: 'MOBILE_SAFARI',
7+
ETC: 'ETC',
8+
};

lib/config/max-canvas-size.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import BROWSER_NAME from './browser-name';
2+
13
// see: https://github.com/jhildenbiddle/canvas-size#test-results
24
// see: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size
35
export default {
4-
chrome: 16384,
5-
firefox: 11180,
6-
'desktop safari': 16384,
7-
'internet explorer': 8192,
8-
'mobile safari': 4096,
9-
etc: 8192,
6+
[BROWSER_NAME.CHROME]: 16384,
7+
[BROWSER_NAME.FIREFOX]: 11180,
8+
[BROWSER_NAME.DESKTOP_SAFARI]: 16384,
9+
[BROWSER_NAME.IE]: 8192,
10+
[BROWSER_NAME.MOBILE_SAFARI]: 4096,
11+
[BROWSER_NAME.ETC]: 8192,
1012
};

lib/image-compression.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export default async function compress(file, options, previousProgress = 0) {
4545
incProgress();
4646

4747
// drawFileInCanvas
48-
const [, origCanvas] = await drawFileInCanvas(file);
48+
const [, origCanvas] = await drawFileInCanvas(file, options);
4949

5050
incProgress();
5151

lib/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ declare namespace imageCompression {
2929
function getFilefromDataUrl(dataUrl: string, filename: string, lastModified?: number): Promise<File>;
3030
function loadImage(src: string): Promise<HTMLImageElement>;
3131
function drawImageInCanvas(img: HTMLImageElement, fileType?: string): HTMLCanvasElement;
32-
function drawFileInCanvas(file: File): Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement]>;
32+
function drawFileInCanvas(file: File, options?: Options): Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement]>;
3333
function canvasToFile(canvas: HTMLCanvasElement, fileType: string, fileName: string, fileLastModified: number, quality?: number): Promise<File>;
3434
function getExifOrientation(file: File): Promise<number>;
3535
}

lib/utils.js

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import UPNG from './UPNG';
2-
import MaxCanvasSize from './config/max-canvas-size';
2+
import MAX_CANVAS_SIZE from './config/max-canvas-size';
3+
import BROWSER_NAME from './config/browser-name';
34

45
const isBrowser = typeof window !== 'undefined'; // change browser environment to support SSR
56

@@ -86,21 +87,25 @@ export function loadImage(src) {
8687
* @returns {string}
8788
*/
8889
export function getBrowserName() {
89-
let browserName = 'etc';
90+
if (getBrowserName.cachedResult !== undefined) {
91+
return getBrowserName.cachedResult;
92+
}
93+
let browserName = BROWSER_NAME.ETC;
9094
const { userAgent } = navigator;
9195
if (/Chrom(e|ium)/i.test(userAgent)) {
92-
browserName = 'chrome';
96+
browserName = BROWSER_NAME.CHROME;
9397
} else if (/iP(ad|od|hone)/i.test(userAgent) && /WebKit/i.test(userAgent) && !(/(CriOS|FxiOS|OPiOS|mercury)/i.test(userAgent))) {
9498
// see: https://stackoverflow.com/a/35813965
95-
browserName = 'mobile safari';
99+
browserName = BROWSER_NAME.MOBILE_SAFARI;
96100
} else if (/Safari/i.test(userAgent)) {
97-
browserName = 'desktop safari';
101+
browserName = BROWSER_NAME.DESKTOP_SAFARI;
98102
} else if (/Firefox/i.test(userAgent)) {
99-
browserName = 'firefox';
103+
browserName = BROWSER_NAME.FIREFOX;
100104
} else if (/MSIE/i.test(userAgent) || (!!document.documentMode) === true) { // IF IE > 10
101-
browserName = 'internet explorer';
105+
browserName = BROWSER_NAME.IE;
102106
}
103-
return browserName;
107+
getBrowserName.cachedResult = browserName;
108+
return getBrowserName.cachedResult;
104109
}
105110

106111
/**
@@ -114,7 +119,7 @@ export function getBrowserName() {
114119
*/
115120
export function approximateBelowMaximumCanvasSizeOfBrowser(initWidth, initHeight) {
116121
const browserName = getBrowserName();
117-
const maximumCanvasSize = MaxCanvasSize[browserName];
122+
const maximumCanvasSize = MAX_CANVAS_SIZE[browserName];
118123

119124
let width = initWidth;
120125
let height = initHeight;
@@ -212,11 +217,11 @@ export function isIOS() {
212217
* @param {File | Blob} file
213218
* @returns {Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement | OffscreenCanvas]>}
214219
*/
215-
export async function drawFileInCanvas(file) {
220+
export async function drawFileInCanvas(file, options = {}) {
216221
let img;
217222
try {
218-
if (isIOS()) {
219-
throw new Error('Skip createImageBitmap on IOS device'); // see https://github.com/Donaldcwl/browser-image-compression/issues/118
223+
if (isIOS() || [BROWSER_NAME.DESKTOP_SAFARI, BROWSER_NAME.MOBILE_SAFARI].includes(getBrowserName())) {
224+
throw new Error('Skip createImageBitmap on IOS and Safari'); // see https://github.com/Donaldcwl/browser-image-compression/issues/118
220225
}
221226
img = await createImageBitmap(file);
222227
} catch (e) {
@@ -233,7 +238,7 @@ export async function drawFileInCanvas(file) {
233238
throw e2;
234239
}
235240
}
236-
const canvas = drawImageInCanvas(img, file.type);
241+
const canvas = drawImageInCanvas(img, options.fileType || file.type);
237242
return [img, canvas];
238243
}
239244

@@ -287,7 +292,7 @@ export function cleanupCanvasMemory(canvas) {
287292
// Check if browser supports automatic image orientation
288293
// see https://github.com/blueimp/JavaScript-Load-Image/blob/1e4df707821a0afcc11ea0720ee403b8759f3881/js/load-image-orientation.js#L37-L53
289294
export async function isAutoOrientationInBrowser() {
290-
if (isAutoOrientationInBrowser.result !== undefined) return isAutoOrientationInBrowser.result;
295+
if (isAutoOrientationInBrowser.cachedResult !== undefined) return isAutoOrientationInBrowser.cachedResult;
291296

292297
// black 2x1 JPEG, with the following meta information set:
293298
// EXIF Orientation: 6 (Rotated 90° CCW)
@@ -305,8 +310,8 @@ export async function isAutoOrientationInBrowser() {
305310
const img = (await drawFileInCanvas(testImageFile2))[0];
306311
// console.log('img', img.width, img.height)
307312

308-
isAutoOrientationInBrowser.result = img.width === 1 && img.height === 2;
309-
return isAutoOrientationInBrowser.result;
313+
isAutoOrientationInBrowser.cachedResult = img.width === 1 && img.height === 2;
314+
return isAutoOrientationInBrowser.cachedResult;
310315
}
311316

312317
/**

lib/web-worker.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import lib from './index';
44
import compress from './image-compression';
55
import { getNewCanvasAndCtx, isIOS } from './utils';
66
import UPNG from './UPNG';
7-
import MaxCanvasSize from './config/max-canvas-size';
7+
import MAX_CANVAS_SIZE from './config/max-canvas-size';
8+
import BROWSER_NAME from './config/browser-name';
89

910
let cnt = 0;
1011
let imageCompressionLibUrl;
@@ -89,7 +90,8 @@ function generateLib() {
8990
getNewCanvasAndCtx = ${getNewCanvasAndCtx}
9091
CustomFileReader = FileReader
9192
CustomFile = File
92-
MaxCanvasSize = ${JSON.stringify(MaxCanvasSize)}
93+
MAX_CANVAS_SIZE = ${JSON.stringify(MAX_CANVAS_SIZE)}
94+
BROWSER_NAME = ${JSON.stringify(BROWSER_NAME)}
9395
function compress (){return (${compress}).apply(null, arguments)}
9496
9597
// core-js

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "browser-image-compression",
3-
"version": "1.0.16",
3+
"version": "1.0.17",
44
"description": "Compress images in the browser",
55
"main": "dist/browser-image-compression.js",
66
"module": "dist/browser-image-compression.mjs",

0 commit comments

Comments
 (0)