t-comm
Version:
专业、稳定、纯粹的工具库
75 lines (68 loc) • 3.47 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var _regeneratorRuntime = require('@babel/runtime/regenerator');
var tslib_es6 = require('../tslib.es6-0d92ef81.js');
var canvas_getCanvas = require('./get-canvas.js');
require('../third-party/canvas.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime);
/**
* 压缩 base64 图片
* - 通过 canvas 缩放图片到指定最大宽度,并转为 JPEG 格式降低体积
* @param {string} base64Img base64 图片字符串(可带或不带 data:image 前缀)
* @param {object} options 压缩选项
* @param {number} options.maxWidth 最大宽度,默认 280
* @param {number} options.quality JPEG 质量 0-1,默认 0.8
* @returns {Promise<string>} 压缩后的 base64 图片字符串
*
* @example
*
* const compressed = await compressBase64Img(base64Str, { maxWidth: 280, quality: 0.8 });
*/
function compressBase64Img(base64Img) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return tslib_es6.__awaiter(this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee() {
var _options$maxWidth, maxWidth, _options$quality, quality, canvasLibrary, createCanvas, loadImage, imgSrc, image, oWidth, oHeight, targetWidth, targetHeight, ratio, canvas, ctx, compressedBase64;
return _regeneratorRuntime__default["default"].wrap(function (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_options$maxWidth = options.maxWidth, maxWidth = _options$maxWidth === void 0 ? 280 : _options$maxWidth, _options$quality = options.quality, quality = _options$quality === void 0 ? 0.8 : _options$quality;
canvasLibrary = canvas_getCanvas.getCanvas();
if (canvasLibrary) {
_context.next = 1;
break;
}
console.warn('[compressBase64Img] canvas 库不可用,返回原图');
return _context.abrupt("return", base64Img);
case 1:
createCanvas = canvasLibrary.createCanvas, loadImage = canvasLibrary.loadImage; // 确保 base64 字符串带有 data URI 前缀
imgSrc = base64Img;
if (!imgSrc.startsWith('data:')) {
imgSrc = "data:image/png;base64,".concat(imgSrc);
}
_context.next = 2;
return loadImage(imgSrc);
case 2:
image = _context.sent;
oWidth = image.width, oHeight = image.height; // 如果原图宽度已经小于等于 maxWidth,不需要缩放,仅做质量压缩
targetWidth = oWidth;
targetHeight = oHeight;
if (oWidth > maxWidth) {
ratio = maxWidth / oWidth;
targetWidth = maxWidth;
targetHeight = Math.round(oHeight * ratio);
}
canvas = createCanvas(targetWidth, targetHeight);
ctx = canvas.getContext('2d');
ctx.drawImage(image, 0, 0, targetWidth, targetHeight);
// 转为 JPEG 格式以获得更好的压缩率
compressedBase64 = canvas.toDataURL('image/jpeg', quality);
return _context.abrupt("return", compressedBase64);
case 3:
case "end":
return _context.stop();
}
}, _callee);
}));
}
exports.compressBase64Img = compressBase64Img;