圖片編輯是在應(yīng)用中經(jīng)常用到的功能,比如相機(jī)拍完照片后可以對(duì)照片進(jìn)行編輯;截圖后可以對(duì)截圖進(jìn)行編輯;可以對(duì)圖庫中的圖片進(jìn)行編輯等。
本例即為大家介紹如何獲取圖片的 pixelMap 數(shù)據(jù),并通過 pixelMap 對(duì)圖片進(jìn)行常見的編輯操作。
效果呈現(xiàn)
本例最終效果如下:
運(yùn)行環(huán)境
本例基于以下環(huán)境開發(fā),開發(fā)者也可以基于其他適配的版本進(jìn)行開發(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
先通過上下文 context 獲取到資源管理器 resourceManager,然后通過資源管理器獲取到圖片數(shù)據(jù),再獲取圖片的 ArrayBuffer。
最后通過 ArrayBuffer 創(chuàng)建 imageSource,獲取到 pixelMap,完成圖片解碼。
②編輯 pixelMap
獲取到 pixelMap 后就可以針對(duì) pixelMap 進(jìn)行裁剪、縮放、偏移、旋轉(zhuǎn)、翻轉(zhuǎn)、調(diào)節(jié)透明度等操作。
③將編輯好的 pixelMap 渲染顯示出來
完成對(duì) pixelMap 的編輯后,可以通過 Image 組件將編輯后的 pixelMap 渲染顯示出來。
開發(fā)步驟
由于本例重點(diǎn)講解圖片編輯,所以開發(fā)步驟會(huì)著重講解相關(guān)實(shí)現(xiàn),不相關(guān)的內(nèi)容不做介紹,全量代碼可參考完整代碼章節(jié)。
①對(duì)圖片進(jìn)行解碼
先通過上下文 context 獲取到資源管理器 resourceManager,然后通過資源管理器獲取到圖片數(shù)據(jù),再獲取圖片的 ArrayBuffer。
最后通過 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
分別通過以下方法對(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 }③通過 Image 組件將編輯后的 pixelMap 渲染顯示出來
第 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后,通過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后,通過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)注
4文章
1351瀏覽量
53612 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68612 -
SDK
+關(guān)注
關(guān)注
3文章
1036瀏覽量
45942 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3722瀏覽量
16317
原文標(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)先 登錄
相關(guān)推薦
評(píng)論