HarmonyOS 图片压缩示例?

HarmonyOS 图片压缩示例?

HarmonyOS
4天前
137浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
一梦南柯2

在 HarmonyOS 中实现图片压缩,可以通过 ​​image.ImagePacker​​ 类来完成。以下是一个基于 HarmonyOS 的图片压缩示例代码,展示了如何将图片压缩到指定的目标大小以内。


### 图片压缩示例代码

#### 步骤 1:引入必要的模块 首先需要引入 HarmonyOS 提供的图片处理模块:

import image from '@ohos.multimedia.image';
import fileio from '@ohos.fileio';
  • 1.
  • 2.

#### 步骤 2:读取图片数据 从文件系统中读取图片数据,并将其加载为 ​​ArrayBuffer​​:

function readImageFile(filePath: string): ArrayBuffer {
    const file = fileio.openSync(filePath, fileio.OpenMode.READ_ONLY);
    const stat = fileio.statSync(filePath);
    const buffer = new ArrayBuffer(stat.size);
    fileio.readSync(file.fd, buffer);
    fileio.closeSync(file);
    return buffer;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

#### 步骤 3:创建 ImagePacker 实例 使用 ​​image.ImagePacker​​ 创建一个图片压缩器实例:

async function compressImage(inputPath: string, outputPath: string, targetSizeKB: number) {
    const imagePacker = image.createImagePacker();

    // 读取原始图片数据
    const imageData = readImageFile(inputPath);

    // 配置压缩参数
    const packingOptions = {
        format: 'image/jpeg', // 支持 jpeg、webp、png 
        quality: 85,         // 初始质量(0-100)
    };

    // 使用二分法查找最接近目标大小的质量值
    let lowQuality = 0;
    let highQuality = 100;
    let bestQuality = 85;

    while (lowQuality <= highQuality) {
        const midQuality = Math.floor((lowQuality + highQuality) / 2);
        packingOptions.quality = midQuality;

        // 压缩图片并保存到临时文件
        await imagePacker.packing(imageData, packingOptions).then((compressedData) => {
            const compressedSizeKB = compressedData.byteLength / 1024;

            if (compressedSizeKB <= targetSizeKB) {
                bestQuality = midQuality; // 记录最佳质量
                lowQuality = midQuality + 1; // 尝试更高的质量
            } else {
                highQuality = midQuality - 1; // 尝试更低的质量
            }
        });
    }

    // 使用最佳质量重新压缩图片
    packingOptions.quality = bestQuality;
    const finalCompressedData = await imagePacker.packing(imageData, packingOptions);

    // 将压缩后的图片写入目标文件
    const outputFile = fileio.openSync(outputPath, fileio.OpenMode.CREATE | fileio.OpenMode.WRITE_ONLY);
    fileio.writeSync(outputFile.fd, finalCompressedData);
    fileio.closeSync(outputFile);

    console.log(`Image compressed successfully. Final size: ${finalCompressedData.byteLength / 1024} KB`);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

### 运行示例 假设你有一张图片文件 ​​input.jpg​​,希望将其压缩到 200 KB 以内,并保存为 ​​output.jpg​​,可以调用以下代码:

compressImage('/path/to/input.jpg', '/path/to/output.jpg', 200)
    .then(() => {
        console.log('Compression completed.');
    })
    .catch((err) => {
        console.error('Compression failed:', err);
    });
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

### 注意事项

  1. 支持的格式
    当前 HarmonyOS 支持的图片压缩格式包括 JPEG、WebP 和 PNG。根据需求选择合适的格式。
  2. 性能优化
    使用二分查找算法可以快速找到最接近目标大小的图片质量,从而提升压缩效率。
  3. 权限配置
    确保在 module.json5 文件中配置了文件访问权限:
"requestPermissions": [
    "ohos.permission.READ_USER_STORAGE",
    "ohos.permission.WRITE_USER_STORAGE"
]
  • 1.
  • 2.
  • 3.
  • 4.
  1. 内存管理
    在资源受限的设备上,注意释放不再使用的内存,避免内存泄漏。

通过上述代码和步骤,你可以轻松实现 HarmonyOS 中的图片压缩功能。如果有更多具体需求或问题,请随时沟通!

分享
微博
QQ
微信
回复
3天前
小泽ccc

在 HarmonyOS 中,你可以借助​ImageSource​​ImagePacker​实现图片压缩。

分享
微博
QQ
微信
回复
3天前


相关问题
HarmonyOS 图片压缩失败
543浏览 • 1回复 待解决
HarmonyOS 图片压缩问题
734浏览 • 1回复 待解决
HarmonyOS 图片压缩工具
522浏览 • 1回复 待解决
HarmonyOS 如何压缩本地图片
656浏览 • 1回复 待解决
HarmonyOS图片压缩不到指定大小
1229浏览 • 1回复 待解决
HarmonyOS 图片压缩图片转base64
1005浏览 • 1回复 待解决
HarmonyOS 怎么对图片进行压缩上传
701浏览 • 1回复 待解决
HarmonyOS 图片的加载与压缩服务
751浏览 • 1回复 待解决
HarmonyOS 图片的加载与压缩服务?
738浏览 • 0回复 待解决
flutter适配HarmonyOS图片压缩的库
772浏览 • 1回复 待解决
HarmonyOS 图片大图浏览页面示例
627浏览 • 1回复 待解决
HarmonyOS 如何压缩图片之后再上传?
450浏览 • 1回复 待解决
HarmonyOS 是否有图片滑块验证示例
551浏览 • 1回复 待解决
HarmonyOS 图片、视频文件压缩的demo
374浏览 • 1回复 待解决
使用图片压缩API的参数影响
1226浏览 • 1回复 待解决
HarmonyOS 相册选择后压缩图片大小
625浏览 • 1回复 待解决
图片压缩指定宽高和限制大小
1554浏览 • 1回复 待解决
恭喜您,今日已阅读两篇内容,特奖励+2声望, 快来领取吧。