第14章_HarmonyOs开发图解 图像
第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 能力实现拍照识别文字的完整流程

相关新闻

ROS2通信接口解析:从DDS原理到机器人开发实践

ROS2通信接口解析:从DDS原理到机器人开发实践

1. ROS2通信接口的本质与演进在机器人开发领域,通信系统如同机器人的神经系统。ROS2对通信接口的重构,解决了ROS1时代诸多痛点。我曾参与过多个从ROS1迁移到ROS2的工业机器人项目,深刻体会到新架构带来的变革。ROS2采用DDS(数据分…

2026/7/29 5:06:04 阅读更多
Frida MemoryAccessMonitor:内存访问监控原理与逆向工程实战

Frida MemoryAccessMonitor:内存访问监控原理与逆向工程实战

1. 项目概述:为什么需要精准的内存读写监听?在逆向工程、安全研究或者应用调试的日常里,我们常常会遇到一个核心需求:我想知道某个程序在运行时,到底在内存的哪个位置、以什么方式、读取或修改了哪些数据。传统的断点调…

2026/7/29 5:06:04 阅读更多
2026年大数据分析工具推荐:性能与扩展对比

2026年大数据分析工具推荐:性能与扩展对比

大数据分析工具这几年的选择面确实宽了很多,从开源引擎到商业平台,从云上服务到本地部署,每家都在强调"快"和"大"。但在实际落地中,"大数据分析"真正难的不是能不能跑起来,而是当数据量…

2026/7/29 5:06:04 阅读更多
高通8155平台AOSP+BSP代码编译实战:从环境搭建到镜像烧录

高通8155平台AOSP+BSP代码编译实战:从环境搭建到镜像烧录

1. 项目概述:为什么高通8155平台的开源代码如此重要? 最近有不少做车机系统开发的朋友在后台问我,有没有高通8155平台最新的开源代码和编译方法。这确实是个好问题,也是当前智能座舱开发领域的一个核心痛点。高通骁龙8155芯片&am…

2026/7/29 5:06:04 阅读更多
基于STM32的智能小车设计:从硬件选型到PID循迹算法实战

基于STM32的智能小车设计:从硬件选型到PID循迹算法实战

1. 项目概述:从零打造一台“全能”智能小车搞嵌入式开发,尤其是玩单片机的朋友,十个里有八个都绕不开“智能小车”这个经典项目。它就像电子工程师的“Hello World”,但远比打印一行字复杂和有趣得多。今天我想分享的,…

2026/7/29 5:06:04 阅读更多
IP地址与子网掩码计算:网络排错与规划的必备基本功

IP地址与子网掩码计算:网络排错与规划的必备基本功

1. 从一次真实的网络故障说起:为什么IP计算是基本功那天下午,整个办公室的网络突然变得奇慢无比,部分同事甚至完全无法访问内部的文件服务器。作为团队里对网络稍有了解的人,我被叫去帮忙。初步排查,路由器和交换机指示…

2026/7/29 4:56:04 阅读更多