第14章_HarmonyOs開(kāi)發(fā)圖解 圖像
第14章 HarmonyOs開(kāi)發(fā)圖解 圖像HarmonyOS 學(xué)習(xí)系統(tǒng) | 階段三高級(jí)深耕期學(xué)習(xí)目標(biāo)序號(hào)能力1掌握?qǐng)D像解碼ImageSource與編碼ImagePacker的完整流程2能夠使用 PixelMap 進(jìn)行像素級(jí)操作3掌握?qǐng)D像縮放、裁剪、EXIF 信息讀取等常用功能核心圖解內(nèi)容講解14.1 圖像處理概述HarmonyOS 的圖像處理模塊圍繞三個(gè)核心類(lèi)展開(kāi)ImageSource圖像源/解碼器、PixelMap位圖/像素容器、ImagePacker圖像編碼器。這三個(gè)類(lèi)組成了讀取 - 處理 - 保存的完整圖像處理管線。生活化類(lèi)比PixelMap 就像樂(lè)高底板圖像解碼就像拆快遞包裝JPEG/PNG 圖片就像被打包好的快遞里面是像素?cái)?shù)據(jù)但被壓縮了。解碼Decode就是拆開(kāi)包裝把像素?cái)?shù)據(jù)整齊地?cái)[放在一塊樂(lè)高底板上——這塊底板就是PixelMap每個(gè)格子就是一個(gè)像素點(diǎn)的顏色值。編碼Encode則反過(guò)來(lái)把底板上的像素重新打包壓縮成圖片格式。14.2 圖像解碼ImageSource 負(fù)責(zé)從各種來(lái)源文件流、資源文件、字節(jié)數(shù)組讀取圖片并解碼為 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 負(fù)責(zé)將 PixelMap 編碼為指定格式的圖片文件并保存。// 編碼圖片保存為 JPEGImagePackerimagePackerImagePacker.create();imagePacker.initializePacking(newFile(path/to/output.jpg),newImagePacker.PackingOptions(image/jpeg,90)// JPEG格式質(zhì)量90);imagePacker.addImage(pixelMap);imagePacker.finalizePacking();// 釋放資源pixelMap.release();imageSource.release();14.4 像素級(jí)操作PixelMap 支持對(duì)單個(gè)像素的讀寫(xiě)操作可以用于圖像特效處理。// 讀取指定位置像素intcolorpixelMap.readPixel(newPosition(100,200));// 寫(xiě)入指定位置像素pixelMap.writePixel(newPosition(100,200),0xFFFF0000);// 紅色// 從顏色數(shù)組創(chuàng)建 PixelMapint[]colorsnewint[width*height];// ... 填充顏色數(shù)據(jù)PixelMapcreatedMapPixelMap.create(colors,width,height,PixelFormat.ARGB_8888);14.5 EXIF 信息讀取通過(guò) ExifUtils 可以讀取照片中嵌入的 GPS 坐標(biāo)、拍攝時(shí)間等元數(shù)據(jù)。// 獲取照片 GPS 坐標(biāo)double[]latLongExifUtils.getLatLong(imageSource);if(latLong!null){HiLog.info(TAG,緯度: latLong[0], 經(jīng)度: latLong[1]);}代碼速查卡API功能示例ImageSource.create(stream, opts)從輸入流創(chuàng)建圖像源ImageSource.create(is, new SourceOptions())createPixelmap(opts)解碼為 PixelMapimageSource.createPixelmap(opts)PixelMap.create(colors, w, h, fmt)從顏色數(shù)組創(chuàng)建位圖PixelMap.create(colors, w, h, ARGB_8888)readPixel(position)讀取指定位置像素pixelMap.readPixel(new Position(100,200))writePixel(position, color)寫(xiě)入指定位置像素pixelMap.writePixel(pos, 0xFFFF0000)ImagePacker.create()創(chuàng)建圖像編碼器ImagePacker.create()ExifUtils.getLatLong()獲取照片 GPS 坐標(biāo)ExifUtils.getLatLong(imageSource)pixelMap.release()釋放 Native 資源pixelMap.release()與 Android/iOS 對(duì)比特性HarmonyOSAndroidiOS位圖類(lèi)PixelMapBitmapCGImage / UIImage解碼ImageSourceBitmapFactoryImageIO編碼ImagePackerBitmap.compress()UIImageJPEGRepresentation()像素操作readPixel / writePixelgetPixel() / setPixel()CGContext 繪制EXIF 讀取ExifUtilsExifInterfaceCGImageDestination縮放解碼DecodingOptions.desiredSizeBitmapFactory.Options.inSampleSizeImageIO 縮略圖?? 踩坑回憶錄OOM為什么圖片一加載就崩潰一張 4000x3000 的圖片解碼后 PixelMap 占用約 48MB 內(nèi)存4000 x 3000 x 4 字節(jié)/像素。我曾在列表頁(yè)同時(shí)加載了 20 張大圖直接 OOM 崩潰。解決辦法縮放解碼在DecodingOptions中設(shè)置desiredSize按顯示尺寸縮放后再加載。列表頁(yè)縮略圖 200x200 就夠了詳情頁(yè)才加載原圖。還有一個(gè)坑PixelMap和ImageSource用完必須調(diào)release()它們持有 Native 資源C/C 層內(nèi)存Java 的 GC 管不了。我曾在循環(huán)里創(chuàng)建了幾十個(gè) PixelMap 不釋放最后系統(tǒng)直接殺掉了我的進(jìn)程。必做實(shí)操任務(wù)序號(hào)任務(wù)難度1實(shí)現(xiàn)圖片解碼并在 Image 組件上顯示低2實(shí)現(xiàn)圖片縮放裁剪設(shè)置 DecodingOptions 的 desiredSize 和 desiredRegion中3讀取照片的 EXIF 信息經(jīng)緯度、海拔并在界面上展示中4實(shí)現(xiàn)圖片格式轉(zhuǎn)換PNG - JPEG中5實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片瀏覽器支持縮放和滑動(dòng)瀏覽高學(xué)習(xí)檢查清單能說(shuō)出 ImageSource、PixelMap、ImagePacker 三者的關(guān)系能實(shí)現(xiàn)圖片解碼并在 UI 上顯示能使用 DecodingOptions 實(shí)現(xiàn)縮放解碼避免 OOM能使用 ImagePacker 將 PixelMap 保存為 JPEG/PNG能使用 readPixel/writePixel 進(jìn)行像素級(jí)操作能讀取照片的 EXIF GPS 信息知道為什么 PixelMap 和 ImageSource 必須手動(dòng) release理解圖片分辨率與內(nèi)存占用的關(guān)系進(jìn)階方向?qū)W習(xí)圖像變換旋轉(zhuǎn)、翻轉(zhuǎn)、裁剪API 的使用探索 PixelMap 的圖像特效處理灰度、模糊、亮度調(diào)節(jié)結(jié)合第 21 章 OCR 能力實(shí)現(xiàn)拍照識(shí)別文字的完整流程和 ImageSource 必須手動(dòng) release理解圖片分辨率與內(nèi)存占用的關(guān)系進(jìn)階方向?qū)W習(xí)圖像變換旋轉(zhuǎn)、翻轉(zhuǎn)、裁剪API 的使用探索 PixelMap 的圖像特效處理灰度、模糊、亮度調(diào)節(jié)結(jié)合第 21 章 OCR 能力實(shí)現(xiàn)拍照識(shí)別文字的完整流程

相關(guān)新聞

文字識(shí)別后排版混亂,掃描版PDF應(yīng)該怎么翻譯?

文字識(shí)別后排版混亂,掃描版PDF應(yīng)該怎么翻譯?

文字識(shí)別后排版混亂,掃描版PDF應(yīng)該怎么翻譯? 掃描版 PDF 的翻譯卡點(diǎn)不在"能不能識(shí)別文字",而在"識(shí)別完之后排版還能不能看"。不少 OCR 工具能把圖片里的文字轉(zhuǎn)成文本,但轉(zhuǎn)完之后段落順序錯(cuò)亂、雙欄被拆成單行…

2026/7/29 5:16:04 閱讀更多
從Cortex-M3內(nèi)核到STM32開(kāi)發(fā):嵌入式入門(mén)核心原理與實(shí)踐指南

從Cortex-M3內(nèi)核到STM32開(kāi)發(fā):嵌入式入門(mén)核心原理與實(shí)踐指南

1. 從零開(kāi)始:為什么是Cortex-M3與STM32?如果你正準(zhǔn)備踏入嵌入式開(kāi)發(fā)的大門(mén),或者剛從51單片機(jī)、Arduino這類(lèi)相對(duì)簡(jiǎn)單的平臺(tái)升級(jí)過(guò)來(lái),那么“STM32”和“Cortex-M3”這兩個(gè)詞對(duì)你來(lái)說(shuō),可能既熟悉又陌生。熟悉是因?yàn)樗鼈儫o(wú)…

2026/7/29 5:16:04 閱讀更多
從C語(yǔ)言查找算法到逆向工程:手把手實(shí)現(xiàn)與學(xué)習(xí)路徑規(guī)劃

從C語(yǔ)言查找算法到逆向工程:手把手實(shí)現(xiàn)與學(xué)習(xí)路徑規(guī)劃

1. 項(xiàng)目概述:從“查找”到“逆向”的C/C學(xué)習(xí)路徑 最近在整理硬盤(pán)里的老項(xiàng)目,翻出來(lái)一堆當(dāng)年學(xué)習(xí)C和C時(shí)寫(xiě)的代碼片段,其中有一個(gè)文件夾特別顯眼,名字就叫“查找算法實(shí)現(xiàn)”。點(diǎn)開(kāi)一看,里面是兩種最基礎(chǔ)的查找算法——順序…

2026/7/29 5:16:04 閱讀更多
HTTP與HTTPS核心原理:從明文傳輸?shù)郊用芪帐峙c性能優(yōu)化

HTTP與HTTPS核心原理:從明文傳輸?shù)郊用芪帐峙c性能優(yōu)化

1. 從“明文快遞”到“武裝押運(yùn)”:HTTP與HTTPS的本質(zhì)透視 干了這么多年開(kāi)發(fā),每次面試新人或者和同行聊起網(wǎng)絡(luò)基礎(chǔ),HTTP和HTTPS這對(duì)“兄弟”總是繞不開(kāi)的話題。表面上看,就是一個(gè)“S”的差別,但背后牽扯到的安全、性能…

2026/7/29 5:16:04 閱讀更多
ROS2通信接口解析:從DDS原理到機(jī)器人開(kāi)發(fā)實(shí)踐

ROS2通信接口解析:從DDS原理到機(jī)器人開(kāi)發(fā)實(shí)踐

1. ROS2通信接口的本質(zhì)與演進(jìn)在機(jī)器人開(kāi)發(fā)領(lǐng)域,通信系統(tǒng)如同機(jī)器人的神經(jīng)系統(tǒng)。ROS2對(duì)通信接口的重構(gòu),解決了ROS1時(shí)代諸多痛點(diǎn)。我曾參與過(guò)多個(gè)從ROS1遷移到ROS2的工業(yè)機(jī)器人項(xiàng)目,深刻體會(huì)到新架構(gòu)帶來(lái)的變革。ROS2采用DDS(數(shù)據(jù)分…

2026/7/29 5:06:04 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過(guò)來(lái)的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫(huà)效果?!?/p>

2026/7/29 0:15:24 閱讀更多