纯血鸿蒙端侧图像处理实测:图匣的格式互转、像素调色、滤镜水印与GIF合成全程离线
最近处理一批产品截图要走压缩、加水印的流程,同事丢来一个在线图片网站,我盯着「上传原图」四个字犹豫了半天——截图里全是未发布的界面。照片一旦传上去,删没删、留没留底,全靠对方良心。最后干脆在鸿蒙手机上用本地方向重做了一遍,用的工具叫「图匣」:八大功能覆盖转码压缩、几何变换、文字水印、滤镜特效、GIF 合成、转 PDF、拼接和信息查看,全程不联网、原图不出手机,目前免费。下面按模块记录实测和实现要点。
挑这类本地图像工具的标准
- 格式要全:至少 JPG/PNG/BMP/GIF/TIFF/WebP 互转,避免为一个格式再装一个 App
- 参数要可控:质量、尺寸、滤镜强度不能只有几档预设
- 处理链路要短:解码、处理、编码、导出在同一进程闭环,中间不经过任何网络请求
- 权限要干净:不申请网络权限,导出走系统文件选择器而不是全存储授权
图匣首页把八个功能分成基础处理、效果处理、编辑合成三组。

转码压缩:ImageSource 与 ImagePacker 的端侧闭环
转码页输出格式支持 JPG/JPEG/PNG/BMP/GIF/TIFF,质量滑杆默认 70%,目标尺寸给了保持原图、4K(3840×2160)、2K、1080P、720P、480P 几档。鸿蒙上这套流程的核心是 @ohos.multimedia.image:
import image from '@ohos.multimedia.image';
const source = image.createImageSource(fd); // 从文件描述符解码
const pixelMap = await source.createPixelMap();
const packer = image.createImagePacker();
const buf = await packer.packing(pixelMap, {
format: 'image/jpeg',
quality: 70, // 对应质量滑杆
});
目标尺寸通过解码参数的 desiredSize 控制,缩放交给系统图像库而不是手写插值,效率和画质都更稳。JPG 有损压缩体积小兼容性好,PNG 走无损,页面提示和实际编码策略一致。

几何变换与像素级调色
变换页支持 90/180/270 度旋转、水平垂直翻转,外加亮度、对比度、饱和度三个滑杆。旋转翻转不用先解码再逐像素搬运,createPixelMap 时直接传 rotate/flip 参数,由底层在解码阶段完成:
const pm = await source.createPixelMap({
rotate: { x: 0, y: 0, z: 1, angle: 90 },
flip: { horizontal: false, vertical: true },
});
亮度、对比度、饱和度是真正的逐像素运算:通过 accessPixels 拿到 RGBA 缓冲区,对每个通道按线性公式换算(亮度加偏移、对比度以 128 为中心拉伸、饱和度在灰度值和原色之间插值),改完写回 PixelMap。滑杆拖动只更新参数、松手后才跑一次全图处理,是避免卡顿的通用做法。

文字水印:离屏 Canvas 加九宫格定位
水印页可自定义文字(默认「图匣水印」)、五种字体颜色、10 到 100px 字号,位置按九宫格走。实现上是一张离屏 Canvas:先 drawImage 画出原图,再设 fillStyle、font、textAlign、textBaseline,按九宫格把坐标映射到画布九个锚点并留出边距,最后 fillText 合成、重新打包导出。文字是矢量绘制,字号随目标分辨率缩放后边缘依然锐利,也不依赖任何外部字体文件。

滤镜特效与 GIF 合成
特效页有模糊、锐化、灰度、棕褐色、暗角五种,强度 0 到 100% 可调。逐像素手写卷积核(比如高斯模糊)在手机上代价很大,工程上更划算的是 @ohos.effectKit 的 Filter 链式接口:
import effectKit from '@ohos.effectKit';
let filter = effectKit.createFilter(pixelMap);
filter = filter.brightness(0.1).saturate(1.4).blur(6).grayscale();
const out = filter.getPixelMap();
暗角这类没有现成算子的效果,再对四角按距离做衰减叠暗即可。

GIF 动画页至少选 2 张图,帧率 1 到 30 FPS、输出质量可调。多帧 GIF 的打包放在 native 层完成,ArkTS 侧只负责收集图片和帧率参数,再把每帧 buffer 传下去;帧延时由 FPS 反推(10 FPS 即每帧 100ms)。合成是纯 CPU 活,图多时要放进 TaskPool 避免阻塞 UI。

信息查看、导出与权限模型
除了六个处理模块,图匣还能查看图片格式、尺寸、EXIF 等信息(对应 ImageSource 的 getImageInfo 与 getImageProperty),以及图片转 PDF、多图拼接。成品先落在应用沙箱,文件页集中管理,点「导出」通过系统文档选择器交给用户指定位置,不需要申请全量存储权限。
安全模型和此前介绍的几个离线工具一致:module.json5 不声明 ohos.permission.INTERNET,照片在物理上无法离开手机;处理全部本地完成,不存在「免费压缩、原图留底」的隐患。应用目前免费,轻度修图和批量加水印完全够用。
小结
图匣把 image 包的解码编码、effectKit 的滤镜、离屏 Canvas 水印和 native 层 GIF 打包串成一条完整的端侧处理链,八个功能共用同一套「沙箱处理、选择器导出」模型。个人实测照片不出手机、参数自由度也够;仅个人实测,功能收费以实际上架页面为准。
更多推荐



所有评论(0)