HarmonyOS之深入解析图像的编码和解码
生活随笔
收集整理的這篇文章主要介紹了
HarmonyOS之深入解析图像的编码和解码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、基本概念
- HarmonyOS 圖像模塊支持圖像業(yè)務(wù)的開發(fā),常見功能如圖像解碼、圖像編碼、基本的位圖操作、圖像編輯等。當(dāng)然,也支持通過接口組合來實現(xiàn)更復(fù)雜的圖像處理邏輯。
- 圖像解碼:圖像解碼就是不同的存檔格式圖片(如 JPEG、PNG 等)解碼為無壓縮的位圖格式,以方便在應(yīng)用或者系統(tǒng)中進(jìn)行相應(yīng)的處理。
- PixelMap:PixelMap 是圖像解碼后無壓縮的位圖格式,用于圖像顯示或者進(jìn)一步的處理。
- 漸進(jìn)式解碼:漸進(jìn)式解碼是在無法一次性提供完整圖像文件數(shù)據(jù)的場景下,隨著圖像文件數(shù)據(jù)的逐步增加,通過多次增量解碼逐步完成圖像解碼的模式。
- 預(yù)乘:預(yù)乘時,RGB 各通道的值被替換為原始值乘以 Alpha 通道不透明的比例(0~1)后的值,方便后期直接合成疊加;不預(yù)乘指 RGB 各通道的數(shù)值是圖像的原始值,與 Alpha 通道的值無關(guān)。
- 圖像編碼:圖像編碼就是將無壓縮的位圖格式,編碼成不同格式的存檔格式圖片( JPEG、PNG 等),以方便在應(yīng)用或者系統(tǒng)中進(jìn)行相應(yīng)的處理。
- 為及時釋放本地資源,建議在圖像解碼的 ImageSource 對象、位圖圖像 PixelMap 對象或圖像編碼的 ImagePacker 對象使用完成后,主動調(diào)用 ImageSource、PixelMap 和 ImagePacker 的 release() 方法。
二、圖像解碼
① 應(yīng)用場景
- 圖像解碼就是將所支持格式的存檔圖片解碼成統(tǒng)一的 PixelMap 圖像,用于后續(xù)圖像顯示或其他處理,比如旋轉(zhuǎn)、縮放、裁剪等。當(dāng)前支持格式包括 JPEG、PNG、GIF、HEIF、WebP、BMP。
② 解碼 API
- mageSource 主要用于圖像解碼:
| create(String pathName, SourceOptions opts) | 從圖像文件路徑創(chuàng)建圖像數(shù)據(jù)源 |
| create(InputStream is, SourceOptions opts) | 從輸入流創(chuàng)建圖像數(shù)據(jù)源 |
| create(byte[] data, SourceOptions opts) | 從字節(jié)數(shù)組創(chuàng)建圖像源 |
| create(byte[] data, int offset, int length, SourceOptions opts) | 從字節(jié)數(shù)組指定范圍創(chuàng)建圖像源 |
| create(File file, SourceOptions opts) | 從文件描述符創(chuàng)建圖像數(shù)據(jù)源 |
| create(FileDescriptor fd, SourceOptions opts) | 創(chuàng)建漸進(jìn)式圖像數(shù)據(jù)源 |
| createIncrementalSource(SourceOptions opts) | 創(chuàng)建漸進(jìn)式圖像數(shù)據(jù)源,支持設(shè)置漸進(jìn)式數(shù)據(jù)更新模式 |
| createIncrementalSource(IncrementalSourceOptions opts) | 從圖像數(shù)據(jù)源解碼并創(chuàng)建PixelMap圖像 |
| createPixelmap(DecodingOptions opts) | 從圖像數(shù)據(jù)源解碼并創(chuàng)建PixelMap圖像,如果圖像數(shù)據(jù)源支持多張圖片的話,支持指定圖像索引 |
| createPixelmap(int index, DecodingOptions opts) | 更新漸進(jìn)式圖像源數(shù)據(jù) |
| updateData(byte[] data, boolean isFinal) | 更新漸進(jìn)式圖像源數(shù)據(jù),支持設(shè)置輸入數(shù)據(jù)的有效數(shù)據(jù)范圍 |
| updateData(byte[] data, int offset, int length, boolean isFinal) | 更新漸進(jìn)式圖像源數(shù)據(jù),支持設(shè)置輸入數(shù)據(jù)的有效數(shù)據(jù)范圍 |
| getImageInfo() | 獲取圖像基本信息 |
| getImageInfo(int index) | 根據(jù)特定的索引獲取圖像基本信息 |
| getSourceInfo() | 獲取圖像源信息 |
| release() | 釋放對象關(guān)聯(lián)的本地資源 |
③ 普通解碼
- 創(chuàng)建圖像數(shù)據(jù)源 ImageSource 對象,可以通過 SourceOptions 指定數(shù)據(jù)源的格式信息,此格式信息僅為給解碼器的提示,正確提供能幫助提高解碼效率,如果不設(shè)置或設(shè)置不正確,會自動檢測正確的圖像格式。不使用該選項時,可以將 create 接口傳入的 SourceOptions 設(shè)置為 null。
- 設(shè)置解碼參數(shù),解碼獲取 PixelMap 圖像對象,解碼過程中同時支持圖像處理操作。
-
- 設(shè)置 desiredSize 支持按尺寸縮放,如果設(shè)置為全 0,則不進(jìn)行縮放。
-
- 設(shè)置 desiredRegion 支持按矩形區(qū)域裁剪,如果設(shè)置為全 0,則不進(jìn)行裁剪。
-
- 設(shè)置 rotateDegrees 支持旋轉(zhuǎn)角度,以圖像中心點(diǎn)順時針旋轉(zhuǎn)。
- 如果只需要解碼原始圖像,不使用該選項時,可將給 createPixelMap 傳入的 DecodingOptions 設(shè)置為 null。
- 解碼完成獲取到 PixelMap 對象后,可以進(jìn)行后續(xù)處理,比如渲染顯示等。
④ 漸進(jìn)式解碼
- 創(chuàng)建漸進(jìn)式圖像數(shù)據(jù)源 ImageSource 對象:可以通過 SourceOptions 指定數(shù)據(jù)源的格式信息,此格式信息僅為提示,如果填寫不正確,會自動檢測正確的圖像格式。使用 IncrementalSourceOptions 指定圖像數(shù)據(jù)的更新方式為漸進(jìn)式更新。
- 漸進(jìn)式更新數(shù)據(jù),在未獲取到全部圖像時,支持先更新部分?jǐn)?shù)據(jù)來嘗試解碼,調(diào)用 updateData 更新數(shù)據(jù),將參數(shù) isFinal 設(shè)置為 false;當(dāng)獲取到全部數(shù)據(jù)后,最后一次更新數(shù)據(jù)時設(shè)置 isFinal為true,表示數(shù)據(jù)更新完畢,設(shè)置解碼參數(shù)同普通解碼。
- 解碼完成獲取到 PixelMap 對象后,可以進(jìn)行后續(xù)處理,比如渲染顯示等。
三、圖像編碼
① 應(yīng)用場景
- 圖像編碼就是將 PixelMap 圖像編碼成不同存檔格式圖片,用于后續(xù)其他處理,比如保存、傳輸?shù)取.?dāng)前僅支持 JPEG 格式。
② 編碼 API
- ImagePacker 主要用于圖像編碼:
| create() | 創(chuàng)建圖像打包器實例 |
| initializePacking(byte[] data, PackingOptions opts) | 初始化打包任務(wù),將字節(jié)數(shù)組設(shè)置為打包后輸出目的 |
| initializePacking(byte[] data, int offset, PackingOptions opts) | 初始化打包任務(wù),將帶偏移量的字節(jié)數(shù)組設(shè)置為打包后輸出目的 |
| initializePacking(OutputStream outputStream, PackingOptions opts) | 初始化打包任務(wù),將輸出流設(shè)置為打包后輸出目的 |
| addImage(PixelMap pixelmap) | 將PixelMap對象添加到圖像打包器中 |
| addImage(ImageSource source) | 將圖像數(shù)據(jù)源ImageSource中圖像添加到圖像打包器中 |
| addImage(ImageSource source, int index) | 將圖像數(shù)據(jù)源ImageSource中指定圖像添加到圖像打包器中 |
| finalizePacking() | 完成圖像打包任務(wù) |
| release() | 釋放對象關(guān)聯(lián)的本地資源 |
③ 圖像編碼流程
- 創(chuàng)建圖像編碼 ImagePacker 對象:
- 設(shè)置編碼輸出流和編碼參數(shù)。設(shè)置 format 為編碼的圖像格式,當(dāng)前支持 jpeg 格式。設(shè)置 quality 為圖像質(zhì)量,范圍從0-100,100為最佳質(zhì)量。
- 添加需要編碼的 PixelMap 對象,進(jìn)行編碼操作。
- 編碼輸出完成后,可以進(jìn)行后續(xù)處理,比如保存、傳輸?shù)取?/li>
總結(jié)
以上是生活随笔為你收集整理的HarmonyOS之深入解析图像的编码和解码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HarmonyOS之深入解析蓝牙Blue
- 下一篇: HarmonyOS之深入解析图像的位图操