第14章_HarmonyOs開發(fā)圖解 圖像
第14章 HarmonyOs開發(fā)圖解 圖像HarmonyOS 學(xué)習(xí)系統(tǒng) | 階段三高級深耕期學(xué)習(xí)目標(biāo)序號能力1掌握圖像解碼ImageSource與編碼ImagePacker的完整流程2能夠使用 PixelMap 進行像素級操作3掌握圖像縮放、裁剪、EXIF 信息讀取等常用功能核心圖解內(nèi)容講解14.1 圖像處理概述HarmonyOS 的圖像處理模塊圍繞三個核心類展開ImageSource圖像源/解碼器、PixelMap位圖/像素容器、ImagePacker圖像編碼器。這三個類組成了讀取 - 處理 - 保存的完整圖像處理管線。生活化類比PixelMap 就像樂高底板圖像解碼就像拆快遞包裝JPEG/PNG 圖片就像被打包好的快遞里面是像素數(shù)據(jù)但被壓縮了。解碼Decode就是拆開包裝把像素數(shù)據(jù)整齊地擺放在一塊樂高底板上——這塊底板就是PixelMap每個格子就是一個像素點的顏色值。編碼Encode則反過來把底板上的像素重新打包壓縮成圖片格式。14.2 圖像解碼ImageSource 負(fù)責(zé)從各種來源文件流、資源文件、字節(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 像素級操作PixelMap 支持對單個像素的讀寫操作可以用于圖像特效處理。// 讀取指定位置像素intcolorpixelMap.readPixel(newPosition(100,200));// 寫入指定位置像素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 信息讀取通過 ExifUtils 可以讀取照片中嵌入的 GPS 坐標(biāo)、拍攝時間等元數(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)寫入指定位置像素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 對比特性HarmonyOSAndroidiOS位圖類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é)/像素。我曾在列表頁同時加載了 20 張大圖直接 OOM 崩潰。解決辦法縮放解碼在DecodingOptions中設(shè)置desiredSize按顯示尺寸縮放后再加載。列表頁縮略圖 200x200 就夠了詳情頁才加載原圖。還有一個坑PixelMap和ImageSource用完必須調(diào)release()它們持有 Native 資源C/C 層內(nèi)存Java 的 GC 管不了。我曾在循環(huán)里創(chuàng)建了幾十個 PixelMap 不釋放最后系統(tǒng)直接殺掉了我的進程。必做實操任務(wù)序號任務(wù)難度1實現(xiàn)圖片解碼并在 Image 組件上顯示低2實現(xiàn)圖片縮放裁剪設(shè)置 DecodingOptions 的 desiredSize 和 desiredRegion中3讀取照片的 EXIF 信息經(jīng)緯度、海拔并在界面上展示中4實現(xiàn)圖片格式轉(zhuǎn)換PNG - JPEG中5實現(xiàn)一個簡單的圖片瀏覽器支持縮放和滑動瀏覽高學(xué)習(xí)檢查清單能說出 ImageSource、PixelMap、ImagePacker 三者的關(guān)系能實現(xiàn)圖片解碼并在 UI 上顯示能使用 DecodingOptions 實現(xiàn)縮放解碼避免 OOM能使用 ImagePacker 將 PixelMap 保存為 JPEG/PNG能使用 readPixel/writePixel 進行像素級操作能讀取照片的 EXIF GPS 信息知道為什么 PixelMap 和 ImageSource 必須手動 release理解圖片分辨率與內(nèi)存占用的關(guān)系進階方向?qū)W習(xí)圖像變換旋轉(zhuǎn)、翻轉(zhuǎn)、裁剪API 的使用探索 PixelMap 的圖像特效處理灰度、模糊、亮度調(diào)節(jié)結(jié)合第 21 章 OCR 能力實現(xiàn)拍照識別文字的完整流程和 ImageSource 必須手動 release理解圖片分辨率與內(nèi)存占用的關(guān)系進階方向?qū)W習(xí)圖像變換旋轉(zhuǎn)、翻轉(zhuǎn)、裁剪API 的使用探索 PixelMap 的圖像特效處理灰度、模糊、亮度調(diào)節(jié)結(jié)合第 21 章 OCR 能力實現(xiàn)拍照識別文字的完整流程

相關(guān)新聞

MicroPython模塊1.2.6解析:從核心機制到硬件驅(qū)動實戰(zhàn)

MicroPython模塊1.2.6解析:從核心機制到硬件驅(qū)動實戰(zhàn)

1. 項目概述:從“模塊”到“生態(tài)”的認(rèn)知升級當(dāng)你第一次在MicroPython的官方文檔或GitHub倉庫里看到“MicroPython模塊 1.2.6”這個標(biāo)題時,可能會覺得這只是一個普通的版本更新日志。但如果你像我一樣,在嵌入式開發(fā)和物聯(lián)網(wǎng)領(lǐng)域摸爬滾打了十幾…

2026/7/29 3:46:02 閱讀更多
AE、VAE、CVAE

AE、VAE、CVAE

簡單講解一下三個主要的自動編碼器 主要思路都是采用一個編碼器和一個解碼器。輸入內(nèi)容經(jīng)過編碼器編碼為潛變量zzz,潛變量zzz經(jīng)過解碼器解碼為輸出內(nèi)容。 AE(Auto Encoder),這是最簡單的自動編碼器,其潛變量是一種低維編碼&#x…

2026/7/29 3:46:02 閱讀更多
AI芯片混戰(zhàn):OpenAI用AMD、DeepSeek用昇騰、英偉達(dá)5000億鎖HBM——誰在挑戰(zhàn)芯片王座?

AI芯片混戰(zhàn):OpenAI用AMD、DeepSeek用昇騰、英偉達(dá)5000億鎖HBM——誰在挑戰(zhàn)芯片王座?

英偉達(dá)的王座到底穩(wěn)不穩(wěn)?這可能是2026年AI行業(yè)最難回答的問題之一。過去十幾天,市場給出了兩個看起來有些矛盾的信號:AMD簽下Anthropic和OpenAI的大單,股價年內(nèi)漲了142%;英偉達(dá)數(shù)據(jù)中心收入依然是AMD的11倍以上&#x…

2026/7/29 3:46:02 閱讀更多
C++實戰(zhàn)指南:從核心價值到現(xiàn)代工具鏈,探索高性能編程的未來

C++實戰(zhàn)指南:從核心價值到現(xiàn)代工具鏈,探索高性能編程的未來

1. 從“老兵”視角看C的當(dāng)下與未來最近在社區(qū)里,看到不少關(guān)于“C是否過時”、“學(xué)C還有沒有前途”的討論。作為一個從大學(xué)就開始摸C,在工業(yè)界用它寫過嵌入式驅(qū)動、游戲引擎、高頻交易系統(tǒng),也用它調(diào)過無數(shù)“段錯誤”和“內(nèi)存泄漏”的老兵&…

2026/7/29 3:46:02 閱讀更多
Python中文文本分析實戰(zhàn):從酒店評價挖掘商業(yè)洞察

Python中文文本分析實戰(zhàn):從酒店評價挖掘商業(yè)洞察

1. 項目概述:從酒店評價中挖掘商業(yè)洞察最近在復(fù)盤一個挺有意思的數(shù)據(jù)分析小項目,核心任務(wù)是對一堆酒店評價文本進行挖掘。這活兒聽起來簡單,不就是看看用戶說了啥嘛,但真做起來,從數(shù)據(jù)清洗到得出有商業(yè)價值的結(jié)論&…

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

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

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

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

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

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

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