Skip to content

Commit ef6f1eb

Browse files
committed
fixed: file size may increase in some situation
1 parent 87caa2e commit ef6f1eb

9 files changed

+37
-27
lines changed
Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
1-
declare module 'browser-image-compression' {
2-
interface Options {
1+
// Type definitions for browser-image-compression 1.0
2+
// Project: https://github.com/Donaldcwl/browser-image-compression
3+
// Definitions by: Donald <https://github.com/Donaldcwl>
4+
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
5+
6+
interface Options {
37
/** @default Number.POSITIVE_INFINITY */
48
maxSizeMB?: number;
59
/** @default undefined */
610
maxWidthOrHeight?: number;
711
/** @default false */
812
useWebWorker?: boolean;
913
/** @default 10 */
10-
maxIteration?: number,
14+
maxIteration?: number;
1115
/** Default to be the exif orientation from the image file */
12-
exifOrientation?: number,
16+
exifOrientation?: number;
1317
/** A function takes one progress argument (progress from 0 to 100) */
14-
onProgress?: (progress: number) => void,
18+
onProgress?: (progress: number) => void;
1519
/** Default to be the original mime type from the image file */
16-
fileType?: string
17-
}
20+
fileType?: string;
21+
}
1822

19-
function imageCompression (image: Blob, options: Options): Promise<File | Blob>;
23+
declare function imageCompression(image: File | Blob, options: Options): Promise<File | Blob>;
2024

21-
export = imageCompression;
22-
}
25+
export as namespace imageCompression;
26+
27+
export = imageCompression;

dist/browser-image-compression.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/browser-image-compression.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/browser-image-compression.mjs

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

dist/browser-image-compression.mjs.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/basic.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@
6868
console.log('ExifOrientation', await imageCompression.getExifOrientation(file))
6969

7070
var options = {
71-
maxSizeMB: document.querySelector('#maxSizeMB').value,
72-
maxWidthOrHeight: document.querySelector('#maxWidthOrHeight').value,
71+
maxSizeMB: parseFloat(document.querySelector('#maxSizeMB').value),
72+
maxWidthOrHeight: parseFloat(document.querySelector('#maxWidthOrHeight').value),
7373
useWebWorker: useWebWorker,
7474
onProgress: onProgress
7575
}

example/development.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@
6868
console.log('ExifOrientation', await imageCompression.getExifOrientation(file))
6969

7070
var options = {
71-
maxSizeMB: document.querySelector('#maxSizeMB').value,
72-
maxWidthOrHeight: document.querySelector('#maxWidthOrHeight').value,
71+
maxSizeMB: parseFloat(document.querySelector('#maxSizeMB').value),
72+
maxWidthOrHeight: parseFloat(document.querySelector('#maxWidthOrHeight').value),
7373
useWebWorker: useWebWorker,
7474
onProgress: onProgress
7575
}

lib/image-compression.js

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,27 +64,32 @@ export default async function compress (file, options) {
6464

6565
let tempFile = await canvasToFile(orientationFixedCanvas, options.fileType || file.type, file.name, file.lastModified, quality)
6666
incProgress()
67+
68+
const origExceedMaxSize = tempFile.size > maxSizeByte
69+
const sizeBecomeLarger = tempFile.size > file.size
70+
6771
// check if we need to compress or resize
68-
if (tempFile.size <= maxSizeByte) {
72+
if (!origExceedMaxSize && !sizeBecomeLarger) {
6973
// no need to compress
7074
setProgress(100)
7175
return tempFile
7276
}
7377

74-
const originalSize = tempFile.size
75-
let currentSize = originalSize
78+
const sourceSize = file.size
79+
const renderedSize = tempFile.size
80+
let currentSize = renderedSize
7681
let compressedFile
7782
let newCanvas, ctx
7883
let canvas = orientationFixedCanvas
79-
while (remainingTrials-- && currentSize > maxSizeByte) {
80-
const newWidth = canvas.width * 0.9
81-
const newHeight = canvas.height * 0.9;
84+
while (remainingTrials-- && (currentSize > maxSizeByte || currentSize > sourceSize)) {
85+
const newWidth = origExceedMaxSize ? canvas.width * 0.95 : canvas.width
86+
const newHeight = origExceedMaxSize ? canvas.height * 0.95 : canvas.height;
8287
[newCanvas, ctx] = getNewCanvasAndCtx(newWidth, newHeight)
8388

8489
ctx.drawImage(canvas, 0, 0, newWidth, newHeight)
8590

8691
if (file.type === 'image/jpeg') {
87-
quality *= 0.9
92+
quality *= 0.95
8893
}
8994
compressedFile = await canvasToFile(newCanvas, options.fileType || file.type, file.name, file.lastModified, quality)
9095

@@ -93,7 +98,7 @@ export default async function compress (file, options) {
9398
canvas = newCanvas
9499

95100
currentSize = compressedFile.size
96-
setProgress(Math.min(99, Math.floor((originalSize - currentSize) / (originalSize - maxSizeByte) * 100)))
101+
setProgress(Math.min(99, Math.floor((renderedSize - currentSize) / (renderedSize - maxSizeByte) * 100)))
97102
}
98103

99104
// garbage clean canvas for safari

lib/utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ export function handleMaxWidthOrHeight (canvas, options) {
186186
const height = canvas.height
187187
const maxWidthOrHeight = options.maxWidthOrHeight
188188

189-
const needToHandle = Number.isInteger(maxWidthOrHeight) && (width > maxWidthOrHeight || height > maxWidthOrHeight)
189+
const needToHandle = Number.isFinite(maxWidthOrHeight) && (width > maxWidthOrHeight || height > maxWidthOrHeight)
190190

191191
let newCanvas = canvas
192192
let ctx

0 commit comments

Comments
 (0)