You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IONIC-Capacitor/Camera:无Canvas/HTML的图片压缩与尺寸调整方案

问题描述

我使用@capacitor/camera库通过以下代码拍照:

let capturedPhoto:any = await Camera
    .getPhoto({
      resultType: CameraResultType.Uri,
      source: CameraSource.Camera,
      quality: 30,
      height: 150,
      allowEditing: false,
      direction: CameraDirection.Front
    })
    .catch(err => {

    });

但在安卓或iOS设备上运行时,生成的PNG图片文件仍过大(近4MB)。该图片需存入Firebase Storage,因用户量较大需节省存储空间。现寻求无需使用Canvas或HTML元素的TypeScript图片压缩/尺寸调整实现方案,且无法在Camera.getPhoto配置中设置为JPG格式。

解决方案

方案1:Capacitor社区原生图片压缩插件

利用原生层面的图片处理能力,无需依赖Canvas或HTML元素,性能更适配移动端:

  • 安装插件:
npm install @capacitor-community/image-resizer
npx cap sync
  • 实现压缩逻辑:
import { ImageResizer, ImageResizerOptions } from '@capacitor-community/image-resizer';
import { Filesystem, Directory } from '@capacitor/filesystem';

async function compressCapturedPhoto(capturedPhoto: any): Promise<string> {
  const filePath = capturedPhoto.webPath || capturedPhoto.path;
  
  const resizeOptions: ImageResizerOptions = {
    path: filePath,
    width: 150,
    height: 150,
    quality: 30,
    format: 'PNG',
  };

  const resizedImage = await ImageResizer.resize(resizeOptions);
  
  const compressedFile = await Filesystem.readFile({
    path: resizedImage.path,
    directory: Directory.Cache
  });

  return compressedFile.data;
}

// 调用示例
const compressedPhoto = await compressCapturedPhoto(capturedPhoto);
// 上传compressedPhoto到Firebase Storage

方案2:纯TypeScript PNG压缩(无原生插件依赖)

使用纯TS的PNG压缩库处理图片数据,适合不想引入原生插件的场景:

  • 安装依赖:
npm install pngquant.js
  • 实现压缩逻辑:
import pngquant from 'pngquant.js';
import { Filesystem } from '@capacitor/filesystem';

async function compressPNGWithTS(capturedPhoto: any): Promise<string> {
  const fileData = await Filesystem.readFile({
    path: capturedPhoto.webPath || capturedPhoto.path,
  });

  const base64Raw = fileData.data.split(',')[1];
  const uint8Array = Uint8Array.from(atob(base64Raw), c => c.charCodeAt(0));

  const compressedData = await pngquant(uint8Array, {
    quality: [0.2, 0.3],
    speed: 1
  });

  const compressedBase64 = btoa(String.fromCharCode(...compressedData));
  return `data:image/png;base64,${compressedBase64}`;
}

// 调用示例
const compressedPNG = await compressPNGWithTS(capturedPhoto);

注意事项

  • 方案1的原生插件压缩效率更高,适合批量图片处理;
  • 方案2的纯TS压缩在低配置设备可能有性能延迟,建议仅用于小尺寸图片;
  • 压缩后的base64数据可直接传入Firebase Storage的putString接口完成上传。

内容的提问来源于stack exchange,提问作者GAJOBAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:53:17