0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony上實現(xiàn)圖片編輯功能

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 2023-06-25 15:17 ? 次閱讀

圖片編輯是在應(yīng)用中經(jīng)常用到的功能,比如相機拍完照片后可以對照片進行編輯;截圖后可以對截圖進行編輯;可以對圖庫中的圖片進行編輯等。

本例即為大家介紹如何獲取圖片的 pixelMap 數(shù)據(jù),并通過 pixelMap 對圖片進行常見的編輯操作。

效果呈現(xiàn)

本例最終效果如下:

wKgaomSX6jWAbYTgAAQDAgWkqGY571.gif

運行環(huán)境

本例基于以下環(huán)境開發(fā),開發(fā)者也可以基于其他適配的版本進行開發(fā):

IDE:DevEco Studio 3.1 Release

SDK:Ohos_sdk_public 3.2.12.5(API Version 9 Release)

實現(xiàn)思路

本例中展示的是對資源文件中的圖片進行編輯,編輯操作主要分為以下三步:

①對圖片解碼,獲取到 pixelMap

先通過上下文 context 獲取到資源管理器 resourceManager,然后通過資源管理器獲取到圖片數(shù)據(jù),再獲取圖片的 ArrayBuffer。

最后通過 ArrayBuffer 創(chuàng)建 imageSource,獲取到 pixelMap,完成圖片解碼。

②編輯 pixelMap

獲取到 pixelMap 后就可以針對 pixelMap 進行裁剪、縮放、偏移、旋轉(zhuǎn)、翻轉(zhuǎn)、調(diào)節(jié)透明度等操作。

③將編輯好的 pixelMap 渲染顯示出來

完成對 pixelMap 的編輯后,可以通過 Image 組件將編輯后的 pixelMap 渲染顯示出來。

開發(fā)步驟

由于本例重點講解圖片編輯,所以開發(fā)步驟會著重講解相關(guān)實現(xiàn),不相關(guān)的內(nèi)容不做介紹,全量代碼可參考完整代碼章節(jié)。

①對圖片進行解碼

先通過上下文 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

分別通過以下方法對 pixelMap 進行裁剪、縮放、偏移、旋轉(zhuǎn)、翻轉(zhuǎn)、調(diào)節(jié)透明度等操作:crop、scale、translate、rotate、flip、opacity。

具體代碼如下:

//對pixelMap進行裁剪
asynccrop_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.crop({x:0,y:0,size:{height:300,width:300}})
this.imagePixelMap=pixelMap
}
//對pixelMap進行縮放
asyncscale_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.scale(0.5,0.5)
this.imagePixelMap=pixelMap
}
//對pixelMap進行偏移
asynctranslate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.translate(100,100);
this.imagePixelMap=pixelMap
}
//對pixelMap進行旋轉(zhuǎn)
asyncrotate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.rotate(90);
this.imagePixelMap=pixelMap
}
//對pixelMap進行翻轉(zhuǎn)
asyncflip_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.flip(false,true);
this.imagePixelMap=pixelMap
}
//對pixelMap進行透明度調(diào)整
asyncopacity_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.opacity(0.5);
this.imagePixelMap=pixelMap
}
③通過 Image 組件將編輯后的 pixelMap 渲染顯示出來

第 2 步中將編輯好的 pixelMap 傳遞給狀態(tài)變量 imagePixelMap,本步中直接將 imagePixelMap 傳入 Image 組件進行渲染顯示。

具體代碼如下:

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組件進行渲染
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
}

//對pixelMap進行裁剪
asynccrop_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.crop({x:0,y:0,size:{height:300,width:300}})
this.imagePixelMap=pixelMap
}

//對pixelMap進行縮放
asyncscale_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.scale(0.5,0.5)
this.imagePixelMap=pixelMap
}

//對pixelMap進行偏移
asynctranslate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.translate(100,100);
this.imagePixelMap=pixelMap
}

//對pixelMap進行旋轉(zhuǎn)
asyncrotate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.rotate(90);
this.imagePixelMap=pixelMap
}

//對pixelMap進行翻轉(zhuǎn)
asyncflip_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.flip(false,true);
this.imagePixelMap=pixelMap
}

//對pixelMap進行透明度調(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組件進行渲染
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%')
}
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 相機
    +關(guān)注

    關(guān)注

    4

    文章

    1303

    瀏覽量

    53132
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67759
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1006

    瀏覽量

    45411
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3546

    瀏覽量

    15734

原文標題:OpenHarmony上實現(xiàn)“圖片編輯”功能

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    HarmonyOS開發(fā)案例:【圖片編輯

    基于canvas組件、圖片編解碼,介紹了圖片編輯實現(xiàn)過程。
    的頭像 發(fā)表于 04-22 16:42 ?697次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>圖片</b><b class='flag-5'>編輯</b>】

    ad9編輯原理圖出現(xiàn)圖片的錯誤

    ad9編輯原理圖出現(xiàn)圖片的錯誤哪位大神指點
    發(fā)表于 05-03 18:40

    HarmonyOS教程—基于圖片處理能力,實現(xiàn)一個圖片編輯模板

    1. 介紹在日常生活中有很多APP都有圖片編輯功能,但由于APP間存在一定的功能差異,開發(fā)者往往要為每個APP單獨實現(xiàn)一套
    發(fā)表于 08-31 10:13

    OpenHarmony 3.0 LTS 新增特性功能

    本帖最后由 soon順soon 于 2021-10-7 21:36 編輯 期待已久的輕量級分布式要來了?https://gitee.com/openharmony/docs/blob
    發(fā)表于 09-30 08:24

    為什么要在OpenHarmony設(shè)備安裝Dropbear呢

    個ssh服務(wù)器的實現(xiàn)軟件,同時具有ssh客戶端的功能。dropbear通常在嵌入式Linux運行,例如大名鼎鼎的OpenWRT默認的ssh的服務(wù)器和客戶端正是dropbear。為什么需要
    發(fā)表于 05-23 17:45

    尼康推出全新視頻和圖片瀏覽編輯軟件

    今日,尼康公司宣布推出全新視頻和圖片瀏覽編輯軟件——NX Studio(1.0版),該軟件能夠實現(xiàn)無縫瀏覽、處理和編輯用尼康數(shù)碼相機拍攝的照片和視頻的新軟件,并且從今日起可免費下載。
    的頭像 發(fā)表于 03-05 09:37 ?2897次閱讀

    OpenHarmony分論壇-OpenHarmony生態(tài)發(fā)展參考

    今天的華為開發(fā)者大會2021,OpenHarmony分論壇展示了OpenHarmony生態(tài)發(fā)展參考。 HDC分論壇-OpenHarmony
    的頭像 發(fā)表于 10-23 16:11 ?1601次閱讀
    <b class='flag-5'>OpenHarmony</b>分論壇-<b class='flag-5'>OpenHarmony</b>生態(tài)發(fā)展參考

    OpenHarmony Dev-Board-SIG專場:代碼Master所需材料

    OpenHarmony Dev-Board-SIG專場:代碼Master所需材料 審核編輯:金巧
    的頭像 發(fā)表于 12-28 14:27 ?1022次閱讀
    <b class='flag-5'>OpenHarmony</b> Dev-Board-SIG專場:代碼<b class='flag-5'>上</b>Master所需材料

    基于openharmony Span實現(xiàn)富文本多種樣式編輯

    項目介紹 項目名稱:Ohos-Rich-text-Editor 所屬系列:openharmony的第三方組件適配移植 功能:Span實現(xiàn)富文本多種樣式的編輯 項目移植狀態(tài):主
    發(fā)表于 03-21 09:26 ?1次下載

    基于openharmony適配移植的圖片加載器

    項目介紹 項目名稱:Sketch 所屬系列:openharmony的第三方組件適配移植 功能:一款強大且全面的圖片加載器,除了圖片加載的必備功能
    發(fā)表于 03-22 14:41 ?3次下載

    如何在OpenHarmony開源代碼基礎(chǔ)實現(xiàn)數(shù)字管家開發(fā)宿舍全屋智能

    基于OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)、數(shù)字管家開發(fā)宿舍全屋智能,實現(xiàn)碰一碰開門、碰一碰開燈、碰一碰開風(fēng)扇以及煙感檢測。因為各項目開發(fā)流程大體相似,本文主要以碰一碰開門為例介紹如何在現(xiàn)
    的頭像 發(fā)表于 08-26 09:55 ?1655次閱讀

    OpenHarmony PhotoView組件的介紹

    PhotoView是OpenAtom OpenHarmony(簡稱“OpenHarmony”)系統(tǒng)的一款圖片縮放及瀏覽的三方組件,用于聲明式應(yīng)用開發(fā),支持圖片縮放、平移、旋轉(zhuǎn)等
    的頭像 發(fā)表于 09-09 10:04 ?1030次閱讀

    HarmonyOS開發(fā)實例:【圖片編輯應(yīng)用】

    通過動態(tài)設(shè)置元素樣式的方式,實現(xiàn)幾種常見的圖片操作,包括裁剪、旋轉(zhuǎn)、縮放和鏡像。
    的頭像 發(fā)表于 04-23 09:42 ?319次閱讀
    HarmonyOS開發(fā)實例:【<b class='flag-5'>圖片</b><b class='flag-5'>編輯</b>應(yīng)用】

    HarmonyOS開發(fā)案例:【圖片編輯

    基于ArkTS的聲明式開發(fā)范式的樣例,主要介紹了圖片編輯實現(xiàn)過程。
    的頭像 發(fā)表于 04-23 20:54 ?237次閱讀
    HarmonyOS開發(fā)案例:【<b class='flag-5'>圖片</b><b class='flag-5'>編輯</b>】

    基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):圖片處理

    (),rotate()接口實現(xiàn)圖片的縮放,裁剪,旋轉(zhuǎn)功能。案例說明:發(fā)表評價頁面點擊添加圖片/照片,頁面跳轉(zhuǎn)到圖片選擇頁面。進入
    的頭像 發(fā)表于 09-20 08:07 ?32次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應(yīng)用開發(fā):<b class='flag-5'>圖片</b>處理