圖解 圖像)
第14章 HarmonyOs開發(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è)核心類展開ImageSource圖像源/解碼器、PixelMap位圖/像素容器、ImagePacker圖像編碼器。這三個(gè)類組成了讀取 - 處理 - 保存的完整圖像處理管線。生活化類比PixelMap 就像樂高底板圖像解碼就像拆快遞包裝JPEG/PNG 圖片就像被打包好的快遞里面是像素?cái)?shù)據(jù)但被壓縮了。解碼Decode就是拆開包裝把像素?cái)?shù)據(jù)整齊地?cái)[放在一塊樂高底板上——這塊底板就是PixelMap每個(gè)格子就是一個(gè)像素點(diǎn)的顏色值。編碼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 像素級(jí)操作PixelMap 支持對(duì)單個(gè)像素的讀寫操作可以用于圖像特效處理。// 讀取指定位置像素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í)間等元數(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 對(duì)比特性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é)/像素。我曾在列表頁同時(shí)加載了 20 張大圖直接 OOM 崩潰。解決辦法縮放解碼在DecodingOptions中設(shè)置desiredSize按顯示尺寸縮放后再加載。列表頁縮略圖 200x200 就夠了詳情頁才加載原圖。還有一個(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í)檢查清單能說出 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í)別文字的完整流程