Files
xk-client-wx/utils/image-compress.js
2026-05-30 16:54:01 +08:00

96 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { openImageCompressModal } from '@/utils/image-compress-modal.js';
export const IMAGE_COMPRESS_THRESHOLD = 1 * 1024 * 1024;
export function formatFileSize(bytes) {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
const value = bytes / k ** i;
return `${Number.parseFloat(value.toFixed(2))} ${sizes[i]}`;
}
/** 压缩节省比例文案,如「(约节省 42%)」 */
export function formatSavingsPercent(originalBytes, compressedBytes) {
if (originalBytes <= 0 || compressedBytes >= originalBytes) {
return '';
}
const percent = Math.round(
((originalBytes - compressedBytes) / originalBytes) * 100,
);
return percent > 0 ? `(约节省 ${percent}%` : '';
}
function getFileInfo(filePath) {
return new Promise((resolve, reject) => {
uni.getFileInfo({
filePath,
success: resolve,
fail: reject,
});
});
}
export function compressImagePath(src, quality) {
return new Promise((resolve, reject) => {
uni.compressImage({
src,
quality,
success: async (res) => {
try {
const info = await getFileInfo(res.tempFilePath);
resolve({
path: res.tempFilePath,
size: info.size,
});
} catch (error) {
reject(error);
}
},
fail: reject,
});
});
}
export async function tryCompressImage(
src,
qualities = [80, 60, 40],
onProgress,
) {
let result = null;
for (const quality of qualities) {
onProgress && onProgress(quality);
result = await compressImagePath(src, quality);
if (result.size <= IMAGE_COMPRESS_THRESHOLD) {
break;
}
}
return result;
}
export function isGifPath(path) {
return /\.gif$/i.test(path || '');
}
export async function prepareImagePath({ path, size }) {
if (size <= IMAGE_COMPRESS_THRESHOLD) {
return {
path,
size,
usedCompress: false,
};
}
const result = await openImageCompressModal({ path, size });
if (!result) {
return null;
}
return {
path: result.path,
size: result.size,
usedCompress: !!result.usedCompress,
};
}