圖片編輯是在應(yīng)用中經(jīng)常用到的功能,比如相機(jī)拍完照片后可以對(duì)照片進(jìn)行編輯;截圖后可以對(duì)截圖進(jìn)行編輯;可以對(duì)圖庫(kù)中的圖片進(jìn)行編輯等。
本例即為大家介紹如何獲取圖片的 pixelMap 數(shù)據(jù),并通過(guò) pixelMap 對(duì)圖片進(jìn)行常見(jiàn)的編輯操作。
效果呈現(xiàn)
本例最終效果如下:

運(yùn)行環(huán)境
本例基于以下環(huán)境開(kāi)發(fā),開(kāi)發(fā)者也可以基于其他適配的版本進(jìn)行開(kāi)發(fā):
IDE:DevEco Studio 3.1 Release
SDK:Ohos_sdk_public 3.2.12.5(API Version 9 Release)
實(shí)現(xiàn)思路
本例中展示的是對(duì)資源文件中的圖片進(jìn)行編輯,編輯操作主要分為以下三步:
①對(duì)圖片解碼,獲取到 pixelMap
先通過(guò)上下文 context 獲取到資源管理器 resourceManager,然后通過(guò)資源管理器獲取到圖片數(shù)據(jù),再獲取圖片的 ArrayBuffer。
最后通過(guò) ArrayBuffer 創(chuàng)建 imageSource,獲取到 pixelMap,完成圖片解碼。
②編輯 pixelMap
獲取到 pixelMap 后就可以針對(duì) pixelMap 進(jìn)行裁剪、縮放、偏移、旋轉(zhuǎn)、翻轉(zhuǎn)、調(diào)節(jié)透明度等操作。
③將編輯好的 pixelMap 渲染顯示出來(lái)
完成對(duì) pixelMap 的編輯后,可以通過(guò) Image 組件將編輯后的 pixelMap 渲染顯示出來(lái)。
開(kāi)發(fā)步驟
由于本例重點(diǎn)講解圖片編輯,所以開(kāi)發(fā)步驟會(huì)著重講解相關(guān)實(shí)現(xiàn),不相關(guān)的內(nèi)容不做介紹,全量代碼可參考完整代碼章節(jié)。
①對(duì)圖片進(jìn)行解碼
先通過(guò)上下文 context 獲取到資源管理器 resourceManager,然后通過(guò)資源管理器獲取到圖片數(shù)據(jù),再獲取圖片的 ArrayBuffer。
最后通過(guò) ArrayBuffer 創(chuàng)建 imageSource,獲取到 pixelMap,完成圖片解碼。
具體代碼如下:
asyncget_pixelmap(){
//獲取resourceManager資源管理
constcontext=getContext(this)
constresourceMgr=context.resourceManager
//獲取rawfile文件夾下httpimage.PNG的ArrayBuffer
constfileData=awaitresourceMgr.getMediaContent($r('app.media.httpimage'))
constbuffer=fileData.buffer
//創(chuàng)建imageSource
constimageSource=image.createImageSource(buffer)
//創(chuàng)建PixelMap
constpixelMap=awaitimageSource.createPixelMap()
returnpixelMap
}
②編輯 pixelMap分別通過(guò)以下方法對(duì) pixelMap 進(jìn)行裁剪、縮放、偏移、旋轉(zhuǎn)、翻轉(zhuǎn)、調(diào)節(jié)透明度等操作:crop、scale、translate、rotate、flip、opacity。
具體代碼如下:
//對(duì)pixelMap進(jìn)行裁剪
asynccrop_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.crop({x:0,y:0,size:{height:300,width:300}})
this.imagePixelMap=pixelMap
}
//對(duì)pixelMap進(jìn)行縮放
asyncscale_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.scale(0.5,0.5)
this.imagePixelMap=pixelMap
}
//對(duì)pixelMap進(jìn)行偏移
asynctranslate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.translate(100,100);
this.imagePixelMap=pixelMap
}
//對(duì)pixelMap進(jìn)行旋轉(zhuǎn)
asyncrotate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.rotate(90);
this.imagePixelMap=pixelMap
}
//對(duì)pixelMap進(jìn)行翻轉(zhuǎn)
asyncflip_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.flip(false,true);
this.imagePixelMap=pixelMap
}
//對(duì)pixelMap進(jìn)行透明度調(diào)整
asyncopacity_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.opacity(0.5);
this.imagePixelMap=pixelMap
}
③通過(guò) Image 組件將編輯后的 pixelMap 渲染顯示出來(lái)第 2 步中將編輯好的 pixelMap 傳遞給狀態(tài)變量 imagePixelMap,本步中直接將 imagePixelMap 傳入 Image 組件進(jìn)行渲染顯示。
具體代碼如下:
if(!this.edit){
Row(){
Image($r('app.media.httpimage')).objectFit(ImageFit.None)
}.width('100%').height('50%').backgroundColor('#F0F0F0')
}else{
Row(){
//將編輯好的pixelMap傳遞給狀態(tài)變量imagePixelMap后,通過(guò)Image組件進(jìn)行渲染
Image(this.imagePixelMap).objectFit(ImageFit.None)
}.width('100%').height('50%').backgroundColor('#F0F0F0')
}
完整代碼
本例完整代碼如下:
importimagefrom'@ohos.multimedia.image'; @Entry @Component structImageEdit{ @StateimagePixelMap:PixelMap=undefined @Stateedit:boolean=false @BuilderbuttonModel($$:{textContent,action}){ Button($$.textContent) .fontSize(14) .height(30) .width(60) .borderRadius(10) .backgroundColor('#E8A027') .onClick(()=>{ $$.action this.edit=true }) } asyncget_pixelmap(){ //獲取resourceManager資源管理 constcontext=getContext(this) constresourceMgr=context.resourceManager //獲取rawfile文件夾下httpimage.PNG的ArrayBuffer constfileData=awaitresourceMgr.getMediaContent($r('app.media.httpimage')) constbuffer=fileData.buffer //創(chuàng)建imageSource constimageSource=image.createImageSource(buffer) //創(chuàng)建PixelMap constpixelMap=awaitimageSource.createPixelMap() returnpixelMap } //對(duì)pixelMap進(jìn)行裁剪 asynccrop_image(){ letpixelMap=awaitthis.get_pixelmap() pixelMap.crop({x:0,y:0,size:{height:300,width:300}}) this.imagePixelMap=pixelMap } //對(duì)pixelMap進(jìn)行縮放 asyncscale_image(){ letpixelMap=awaitthis.get_pixelmap() pixelMap.scale(0.5,0.5) this.imagePixelMap=pixelMap } //對(duì)pixelMap進(jìn)行偏移 asynctranslate_image(){ letpixelMap=awaitthis.get_pixelmap() pixelMap.translate(100,100); this.imagePixelMap=pixelMap } //對(duì)pixelMap進(jìn)行旋轉(zhuǎn) asyncrotate_image(){ letpixelMap=awaitthis.get_pixelmap() pixelMap.rotate(90); this.imagePixelMap=pixelMap } //對(duì)pixelMap進(jìn)行翻轉(zhuǎn) asyncflip_image(){ letpixelMap=awaitthis.get_pixelmap() pixelMap.flip(false,true); this.imagePixelMap=pixelMap } //對(duì)pixelMap進(jìn)行透明度調(diào)整 asyncopacity_image(){ letpixelMap=awaitthis.get_pixelmap() pixelMap.opacity(0.5); this.imagePixelMap=pixelMap } build(){ Column(){ if(!this.edit){ Row(){ Image($r('app.media.httpimage')).objectFit(ImageFit.None) }.width('100%').height('50%').backgroundColor('#F0F0F0') }else{ Row(){ //將編輯好的pixelMap傳遞給狀態(tài)變量imagePixelMap后,通過(guò)Image組件進(jìn)行渲染 Image(this.imagePixelMap).objectFit(ImageFit.None) }.width('100%').height('50%').backgroundColor('#F0F0F0') } Flex({wrap:FlexWrap.Wrap,justifyContent:FlexAlign.SpaceEvenly}){ this.buttonModel({textContent:'裁剪',action:this.crop_image()}) this.buttonModel({textContent:'縮放',action:this.scale_image()}) this.buttonModel({textContent:'偏移',action:this.translate_image()}) this.buttonModel({textContent:'旋轉(zhuǎn)',action:this.rotate_image()}) this.buttonModel({textContent:'翻轉(zhuǎn)',action:this.flip_image()}) this.buttonModel({textContent:'透明度',action:this.opacity_image()}) Button('還原') .fontSize(14) .height(30) .width(60) .borderRadius(10) .margin({top:20}) .backgroundColor('#A4AE77') .onClick(()=>{ this.edit=false }) } .margin({top:100}) .height('100%') .width('100%') } .height('100%') .width('100%') } }
審核編輯:湯梓紅
-
相機(jī)
+關(guān)注
關(guān)注
5文章
1577瀏覽量
55791 -
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73954 -
SDK
+關(guān)注
關(guān)注
3文章
1101瀏覽量
51713 -
OpenHarmony
+關(guān)注
關(guān)注
33文章
3952瀏覽量
21093
原文標(biāo)題:OpenHarmony上實(shí)現(xiàn)“圖片編輯”功能
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于開(kāi)源鴻蒙的圖片編輯開(kāi)發(fā)樣例(1)
基于開(kāi)源鴻蒙的圖片編輯開(kāi)發(fā)樣例(2)
HarmonyOS教程—基于圖片處理能力,實(shí)現(xiàn)一個(gè)圖片編輯模板
為什么要在OpenHarmony設(shè)備上安裝Dropbear呢
尼康推出全新視頻和圖片瀏覽編輯軟件
OpenHarmony分論壇-OpenHarmony生態(tài)發(fā)展參考
基于openharmony Span實(shí)現(xiàn)富文本多種樣式編輯
基于openharmony適配移植的圖片加載器
如何在OpenHarmony開(kāi)源代碼基礎(chǔ)上實(shí)現(xiàn)數(shù)字管家開(kāi)發(fā)宿舍全屋智能
OpenHarmony PhotoView組件的介紹
HarmonyOS開(kāi)發(fā)實(shí)例:【圖片編輯應(yīng)用】
基于ArkTS語(yǔ)言的OpenHarmony APP應(yīng)用開(kāi)發(fā):圖片處理
OpenHarmony上實(shí)現(xiàn)圖片編輯功能
評(píng)論