UNPKG

t-comm

Version:

专业、稳定、纯粹的工具库

75 lines (68 loc) 3.47 kB
'use strict'; 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;