第14章 HarmonyOs开发图解 图像HarmonyOS 学习系统 | 阶段三高级深耕期学习目标序号能力1掌握图像解码ImageSource与编码ImagePacker的完整流程2能够使用 PixelMap 进行像素级操作3掌握图像缩放、裁剪、EXIF 信息读取等常用功能核心图解内容讲解14.1 图像处理概述HarmonyOS 的图像处理模块围绕三个核心类展开ImageSource图像源/解码器、PixelMap位图/像素容器、ImagePacker图像编码器。这三个类组成了读取 - 处理 - 保存的完整图像处理管线。生活化类比PixelMap 就像乐高底板图像解码就像拆快递包装JPEG/PNG 图片就像被打包好的快递里面是像素数据但被压缩了。解码Decode就是拆开包装把像素数据整齐地摆放在一块乐高底板上——这块底板就是PixelMap每个格子就是一个像素点的颜色值。编码Encode则反过来把底板上的像素重新打包压缩成图片格式。14.2 图像解码ImageSource 负责从各种来源文件流、资源文件、字节数组读取图片并解码为 PixelMap。// 从资源文件解码图片InputStreamisgetResourceManager().getResource(MediaTable.INPUT);ImageSourceimageSourceImageSource.create(is,newSourceOptions());PixelMappixelMapimageSource.createPixelmap(newDecodingOptions());imageDecode.setPixelMap(pixelMap);// 带缩放的解码避免 OOMDecodingOptionsoptsnewDecodingOptions();opts.desiredSizenewSize(400,300);// 缩放到 400x300PixelMapscaledMapimageSource.createPixelmap(opts);14.3 图像编码与保存ImagePacker 负责将 PixelMap 编码为指定格式的图片文件并保存。// 编码图片保存为 JPEGImagePackerimagePackerImagePacker.create();imagePacker.initializePacking(newFile(path/to/output.jpg),newImagePacker.PackingOptions(image/jpeg,90)// JPEG格式质量90);imagePacker.addImage(pixelMap);imagePacker.finalizePacking();// 释放资源pixelMap.release();imageSource.release();14.4 像素级操作PixelMap 支持对单个像素的读写操作可以用于图像特效处理。// 读取指定位置像素intcolorpixelMap.readPixel(newPosition(100,200));// 写入指定位置像素pixelMap.writePixel(newPosition(100,200),0xFFFF0000);// 红色// 从颜色数组创建 PixelMapint[]colorsnewint[width*height];// ... 填充颜色数据PixelMapcreatedMapPixelMap.create(colors,width,height,PixelFormat.ARGB_8888);14.5 EXIF 信息读取通过 ExifUtils 可以读取照片中嵌入的 GPS 坐标、拍摄时间等元数据。// 获取照片 GPS 坐标double[]latLongExifUtils.getLatLong(imageSource);if(latLong!null){HiLog.info(TAG,纬度: latLong[0], 经度: latLong[1]);}代码速查卡API功能示例ImageSource.create(stream, opts)从输入流创建图像源ImageSource.create(is, new SourceOptions())createPixelmap(opts)解码为 PixelMapimageSource.createPixelmap(opts)PixelMap.create(colors, w, h, fmt)从颜色数组创建位图PixelMap.create(colors, w, h, ARGB_8888)readPixel(position)读取指定位置像素pixelMap.readPixel(new Position(100,200))writePixel(position, color)写入指定位置像素pixelMap.writePixel(pos, 0xFFFF0000)ImagePacker.create()创建图像编码器ImagePacker.create()ExifUtils.getLatLong()获取照片 GPS 坐标ExifUtils.getLatLong(imageSource)pixelMap.release()释放 Native 资源pixelMap.release()与 Android/iOS 对比特性HarmonyOSAndroidiOS位图类PixelMapBitmapCGImage / UIImage解码ImageSourceBitmapFactoryImageIO编码ImagePackerBitmap.compress()UIImageJPEGRepresentation()像素操作readPixel / writePixelgetPixel() / setPixel()CGContext 绘制EXIF 读取ExifUtilsExifInterfaceCGImageDestination缩放解码DecodingOptions.desiredSizeBitmapFactory.Options.inSampleSizeImageIO 缩略图⚠️ 踩坑回忆录OOM为什么图片一加载就崩溃一张 4000x3000 的图片解码后 PixelMap 占用约 48MB 内存4000 x 3000 x 4 字节/像素。我曾在列表页同时加载了 20 张大图直接 OOM 崩溃。解决办法缩放解码在DecodingOptions中设置desiredSize按显示尺寸缩放后再加载。列表页缩略图 200x200 就够了详情页才加载原图。还有一个坑PixelMap和ImageSource用完必须调release()它们持有 Native 资源C/C 层内存Java 的 GC 管不了。我曾在循环里创建了几十个 PixelMap 不释放最后系统直接杀掉了我的进程。必做实操任务序号任务难度1实现图片解码并在 Image 组件上显示低2实现图片缩放裁剪设置 DecodingOptions 的 desiredSize 和 desiredRegion中3读取照片的 EXIF 信息经纬度、海拔并在界面上展示中4实现图片格式转换PNG - JPEG中5实现一个简单的图片浏览器支持缩放和滑动浏览高学习检查清单能说出 ImageSource、PixelMap、ImagePacker 三者的关系能实现图片解码并在 UI 上显示能使用 DecodingOptions 实现缩放解码避免 OOM能使用 ImagePacker 将 PixelMap 保存为 JPEG/PNG能使用 readPixel/writePixel 进行像素级操作能读取照片的 EXIF GPS 信息知道为什么 PixelMap 和 ImageSource 必须手动 release理解图片分辨率与内存占用的关系进阶方向学习图像变换旋转、翻转、裁剪API 的使用探索 PixelMap 的图像特效处理灰度、模糊、亮度调节结合第 21 章 OCR 能力实现拍照识别文字的完整流程和 ImageSource 必须手动 release理解图片分辨率与内存占用的关系进阶方向学习图像变换旋转、翻转、裁剪API 的使用探索 PixelMap 的图像特效处理灰度、模糊、亮度调节结合第 21 章 OCR 能力实现拍照识别文字的完整流程