日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HarmonyOS之深入解析图像的编码和解码

發布時間:2024/5/21 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HarmonyOS之深入解析图像的编码和解码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基本概念

  • HarmonyOS 圖像模塊支持圖像業務的開發,常見功能如圖像解碼、圖像編碼、基本的位圖操作、圖像編輯等。當然,也支持通過接口組合來實現更復雜的圖像處理邏輯。
  • 圖像解碼:圖像解碼就是不同的存檔格式圖片(如 JPEG、PNG 等)解碼為無壓縮的位圖格式,以方便在應用或者系統中進行相應的處理。
  • PixelMap:PixelMap 是圖像解碼后無壓縮的位圖格式,用于圖像顯示或者進一步的處理。
  • 漸進式解碼:漸進式解碼是在無法一次性提供完整圖像文件數據的場景下,隨著圖像文件數據的逐步增加,通過多次增量解碼逐步完成圖像解碼的模式。
  • 預乘:預乘時,RGB 各通道的值被替換為原始值乘以 Alpha 通道不透明的比例(0~1)后的值,方便后期直接合成疊加;不預乘指 RGB 各通道的數值是圖像的原始值,與 Alpha 通道的值無關。
  • 圖像編碼:圖像編碼就是將無壓縮的位圖格式,編碼成不同格式的存檔格式圖片( JPEG、PNG 等),以方便在應用或者系統中進行相應的處理。
  • 為及時釋放本地資源,建議在圖像解碼的 ImageSource 對象、位圖圖像 PixelMap 對象或圖像編碼的 ImagePacker 對象使用完成后,主動調用 ImageSource、PixelMap 和 ImagePacker 的 release() 方法。

二、圖像解碼

① 應用場景
  • 圖像解碼就是將所支持格式的存檔圖片解碼成統一的 PixelMap 圖像,用于后續圖像顯示或其他處理,比如旋轉、縮放、裁剪等。當前支持格式包括 JPEG、PNG、GIF、HEIF、WebP、BMP。
② 解碼 API
  • mageSource 主要用于圖像解碼:
接口名描述
create(String pathName, SourceOptions opts)從圖像文件路徑創建圖像數據源
create(InputStream is, SourceOptions opts)從輸入流創建圖像數據源
create(byte[] data, SourceOptions opts)從字節數組創建圖像源
create(byte[] data, int offset, int length, SourceOptions opts)從字節數組指定范圍創建圖像源
create(File file, SourceOptions opts)從文件描述符創建圖像數據源
create(FileDescriptor fd, SourceOptions opts)創建漸進式圖像數據源
createIncrementalSource(SourceOptions opts)創建漸進式圖像數據源,支持設置漸進式數據更新模式
createIncrementalSource(IncrementalSourceOptions opts)從圖像數據源解碼并創建PixelMap圖像
createPixelmap(DecodingOptions opts)從圖像數據源解碼并創建PixelMap圖像,如果圖像數據源支持多張圖片的話,支持指定圖像索引
createPixelmap(int index, DecodingOptions opts)更新漸進式圖像源數據
updateData(byte[] data, boolean isFinal)更新漸進式圖像源數據,支持設置輸入數據的有效數據范圍
updateData(byte[] data, int offset, int length, boolean isFinal)更新漸進式圖像源數據,支持設置輸入數據的有效數據范圍
getImageInfo()獲取圖像基本信息
getImageInfo(int index)根據特定的索引獲取圖像基本信息
getSourceInfo()獲取圖像源信息
release()釋放對象關聯的本地資源
③ 普通解碼
  • 創建圖像數據源 ImageSource 對象,可以通過 SourceOptions 指定數據源的格式信息,此格式信息僅為給解碼器的提示,正確提供能幫助提高解碼效率,如果不設置或設置不正確,會自動檢測正確的圖像格式。不使用該選項時,可以將 create 接口傳入的 SourceOptions 設置為 null。
ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();srcOpts.formatHint = "image/png";String pathName = "/sdcard/image.png";ImageSource imageSource = ImageSource.create(pathName, srcOpts); // 不通過SourceOptions指定數據源格式信息ImageSource imageSourceNoOptions = ImageSource.create(pathName, null);
  • 設置解碼參數,解碼獲取 PixelMap 圖像對象,解碼過程中同時支持圖像處理操作。
    • 設置 desiredSize 支持按尺寸縮放,如果設置為全 0,則不進行縮放。
    • 設置 desiredRegion 支持按矩形區域裁剪,如果設置為全 0,則不進行裁剪。
    • 設置 rotateDegrees 支持旋轉角度,以圖像中心點順時針旋轉。
  • 如果只需要解碼原始圖像,不使用該選項時,可將給 createPixelMap 傳入的 DecodingOptions 設置為 null。
// 普通解碼疊加縮放、裁剪、旋轉ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();decodingOpts.desiredSize = new Size(100, 2000);decodingOpts.desiredRegion = new Rect(0, 0, 100, 100);decodingOpts.rotateDegrees = 90;PixelMap pixelMap = imageSource.createPixelmap(decodingOpts); // 普通解碼PixelMap pixelMapNoOptions = imageSource.createPixelmap(null);
  • 解碼完成獲取到 PixelMap 對象后,可以進行后續處理,比如渲染顯示等。
④ 漸進式解碼
  • 創建漸進式圖像數據源 ImageSource 對象:可以通過 SourceOptions 指定數據源的格式信息,此格式信息僅為提示,如果填寫不正確,會自動檢測正確的圖像格式。使用 IncrementalSourceOptions 指定圖像數據的更新方式為漸進式更新。
ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();srcOpts.formatHint = "image/jpeg";ImageSource.IncrementalSourceOptions incOpts = new ImageSource.IncrementalSourceOptions();incOpts.opts = srcOpts;incOpts.mode = ImageSource.UpdateMode.INCREMENTAL_DATA;imageSource = ImageSource.createIncrementalSource(incOpts);
  • 漸進式更新數據,在未獲取到全部圖像時,支持先更新部分數據來嘗試解碼,調用 updateData 更新數據,將參數 isFinal 設置為 false;當獲取到全部數據后,最后一次更新數據時設置 isFinal為true,表示數據更新完畢,設置解碼參數同普通解碼。
// 獲取到一定的數據時嘗試解碼imageSource.updateData(data, 0, bytes, false);ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();PixelMap pixelMap = imageSource.createPixelmap(decodingOpts);// 更新數據再次解碼,重復調用直到數據全部更新完成imageSource.updateData(data, 0, bytes, false);PixelMap pixelMap = imageSource.createPixelmap(decodingOpts);// 數據全部更新完成時需要傳入isFinal為trueimageSource.updateData(data, 0, bytes, true);PixelMap pixelMap = imageSource.createPixelmap(decodingOpts);
  • 解碼完成獲取到 PixelMap 對象后,可以進行后續處理,比如渲染顯示等。

三、圖像編碼

① 應用場景
  • 圖像編碼就是將 PixelMap 圖像編碼成不同存檔格式圖片,用于后續其他處理,比如保存、傳輸等。當前僅支持 JPEG 格式。
② 編碼 API
  • ImagePacker 主要用于圖像編碼:
接口名描述
create()創建圖像打包器實例
initializePacking(byte[] data, PackingOptions opts)初始化打包任務,將字節數組設置為打包后輸出目的
initializePacking(byte[] data, int offset, PackingOptions opts)初始化打包任務,將帶偏移量的字節數組設置為打包后輸出目的
initializePacking(OutputStream outputStream, PackingOptions opts)初始化打包任務,將輸出流設置為打包后輸出目的
addImage(PixelMap pixelmap)將PixelMap對象添加到圖像打包器中
addImage(ImageSource source)將圖像數據源ImageSource中圖像添加到圖像打包器中
addImage(ImageSource source, int index)將圖像數據源ImageSource中指定圖像添加到圖像打包器中
finalizePacking()完成圖像打包任務
release()釋放對象關聯的本地資源
③ 圖像編碼流程
  • 創建圖像編碼 ImagePacker 對象:
ImagePacker imagePacker = ImagePacker.create();
  • 設置編碼輸出流和編碼參數。設置 format 為編碼的圖像格式,當前支持 jpeg 格式。設置 quality 為圖像質量,范圍從0-100,100為最佳質量。
FileOutputStream outputStream = new FileOutputStream("/path/to/packed.file");ImagePacker.PackingOptions packingOptions = new ImagePacker.PackingOptions();packingOptions.format = "image/jpeg";packingOptions.quality = 90;boolean result = imagePacker.initializePacking(outputStream, packingOptions);
  • 添加需要編碼的 PixelMap 對象,進行編碼操作。
result = imagePacker.addImage(myPixelMap);long dataSize = imagePacker.finalizePacking();
  • 編碼輸出完成后,可以進行后續處理,比如保存、傳輸等。

總結

以上是生活随笔為你收集整理的HarmonyOS之深入解析图像的编码和解码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。