目錄
前言
正文
步驟一、創建工程
步驟二、將圖片轉換為PixelMap
步驟三、圖片引數設定
步驟四、圖片鏡像操作
步驟五、運行演示
結果
前言
圖片處理是目前移動端APP比較常用的需求之一,作為移動端系統平臺,HarmonyOS影像模塊已經支持了影像業務的開發,比如,常見的影像解碼、影像編碼、基本的位圖操作、影像編輯等,當然,也支持通過介面組合來實作更復雜的影像處理邏輯,今天,我們就來看一下,
正文
本文以圖片的旋轉、剪裁、縮放、鏡像四種常見操作為例,給大家介紹HarmonyOS影像編解碼的相關開發技巧,
說真的,這是本人第一次使用鴻蒙系統處理影像的API,上手不是那么快,
第一次使用鴻蒙系統的影像API,姿勢不對的話,請各位老司機糾正,

遇山開道、遇河搭橋,
來吧,走起!
步驟一、創建工程
首先,創建一個空白的java工程,這種方式需要自己書寫對應的圖片操作執行類,也可以使用上一篇文章中的demo,在其基礎上進行修改,
傳送門:【模塊-Java布局】十分鐘挑戰鴻蒙Codelab組件
創建方式:

步驟二、將圖片轉換為PixelMap
鴻蒙系統影像API就是將所支持格式的存檔圖片解碼成統一的PixelMap影像,再用于后續影像顯示或其他處理,其中,常規的操作包括旋轉、縮放、剪裁等,類似于點播系統將上傳的各類視頻和音頻需要轉換成統一的音頻格式和視頻格式,比如常見的H264+AAC,
目前,鴻蒙系統影像API能夠支持的格式,包括 JPEG、PNG、GIF、HEIF、WebP、BMP,
本文相向您介紹的函式 getPixelMapFromResource,其功能就是將resources/base/media目錄下的圖片資源轉換為PixelMap影像,其中入參為圖片的資源ID,
getPixelMapFromResource方法是本文的關鍵方法,具體實作如下:
/**
* 通過圖片ID回傳PixelMap
*
* @param resourceId 圖片的資源ID
* @return 圖片的PixelMap
*/
private PixelMap getPixelMapFromResource(int resourceId) {
InputStream inputStream = null;
try {
// 創建影像資料源ImageSource物件
inputStream = getContext().getResourceManager().getResource(resourceId);
ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();
srcOpts.formatHint = "image/jpg";
ImageSource imageSource = ImageSource.create(inputStream, srcOpts);
// 設定圖片引數,本例使用圖片像素的尺寸為1024*768
// 點擊一次旋轉按鈕會進行90度的旋轉,
// 縮放是按照2:1的比例進行縮放,
// 剪裁是保證寬度不變的情況下對高度進行400像素的剪裁,
ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions();
// 旋轉
decodingOptions.rotateDegrees = 90 * whirlCount;
// 縮放
decodingOptions.desiredSize = new Size(isScale ? 512 : 0, isScale ? 384 : 0);
// 剪裁
decodingOptions.desiredRegion = new Rect(0, 0, isCorp ? 1024 : 0, isCorp ? 400 : 0);
decodingOptions.desiredPixelFormat = PixelFormat.ARGB_8888;
return imageSource.createPixelmap(decodingOptions);
} catch (IOException e) {
HiLog.info(LABEL_LOG, "IOException");
} catch (NotExistException e) {
HiLog.info(LABEL_LOG, "NotExistException");
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
HiLog.info(LABEL_LOG, "inputStream IOException");
}
}
}
return null;
}
步驟三、圖片引數設定
本文使用圖片是mac OS 10.15系統的桌面背景圖片,尺寸為1024*768,
圖片如下:

本文實作的功能包括:點擊一次旋轉按鈕會進行90度的旋轉,縮放是按照2:1的比例進行縮放,剪裁是保證寬度不變的情況下對高度進行400像素的剪裁,相關引數設定如下所示:
// 設定圖片引數
ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions();
// 旋轉
decodingOptions.rotateDegrees = 90 * whirlCount;
// 縮放
decodingOptions.desiredSize = new Size(isScale ? 512 : 0, isScale ? 384 : 0);
// 剪裁
decodingOptions.desiredRegion = new Rect(0, 0, isCorp ? 1024 : 0, isCorp ? 400 : 0);
步驟四、圖片鏡像操作
圖片鏡像操作就是對圖片以縱坐標為軸制作對稱圖片,image繪制的時候會呼叫onDraw方法,本例采用對影像Canvas畫布的鏡像操作實作圖片的鏡像顯示,示例代碼如下所示:
private void mirrorImage(PixelMap pixelMap) {
scaleX = -scaleX;
image.addDrawTask(
new Component.DrawTask() {
@Override
public void onDraw(Component component, Canvas canvas) {
if (isMirror) {
isMirror = false;
PixelMapHolder pmh = new PixelMapHolder(pixelMap);
canvas.scale(
scaleX,
1.0f,
(float) pixelMap.getImageInfo().size.width / 2,
(float) pixelMap.getImageInfo().size.height / 2);
canvas.drawPixelMapHolder(
pmh,
0,
0,
new Paint());
}
}
});
}
步驟五、運行演示
截圖是IDE的完整代碼:

執行結果:

結果
本文雖然可以把demo運行起來了,但是不夠完美,其實之前在windows上跑通過,但是這次用的是mac OS的本子,因為今天是最后的截止時間,沒辦法,自己又在mac上搞了一遍,不知道是不是鴻蒙影像API在mac上存在兼容問題,還是自己寫出了新bug,使用模擬器運行時,有時會崩潰,
但是,不管怎么說,鴻蒙也一直在進步,期待以后更好用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280581.html
標籤:其他
上一篇:Java——資料結構之順序表
下一篇:Apache優化
