0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony上实现图片编辑功能

OpenHarmony技术社区 来源:OST开源开发者 2023-06-25 15:17 次阅读

图片编辑是在应用中经常用到的功能,比如相机拍完照片后可以对照片进行编辑;截图后可以对截图进行编辑;可以对图库中的图片进行编辑等。

本例即为大家介绍如何获取图片的 pixelMap 数据,并通过 pixelMap 对图片进行常见的编辑操作。

效果呈现

本例最终效果如下:

wKgaomSX6jWAbYTgAAQDAgWkqGY571.gif

运行环境

本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发:

IDE:DevEco Studio 3.1 Release

SDK:Ohos_sdk_public 3.2.12.5(API Version 9 Release)

实现思路

本例中展示的是对资源文件中的图片进行编辑,编辑操作主要分为以下三步:

①对图片解码,获取到 pixelMap

先通过上下文 context 获取到资源管理器 resourceManager,然后通过资源管理器获取到图片数据,再获取图片的 ArrayBuffer。

最后通过 ArrayBuffer 创建 imageSource,获取到 pixelMap,完成图片解码。

②编辑 pixelMap

获取到 pixelMap 后就可以针对 pixelMap 进行裁剪、缩放、偏移、旋转、翻转、调节透明度等操作。

③将编辑好的 pixelMap 渲染显示出来

完成对 pixelMap 的编辑后,可以通过 Image 组件将编辑后的 pixelMap 渲染显示出来。

开发步骤

由于本例重点讲解图片编辑,所以开发步骤会着重讲解相关实现,不相关的内容不做介绍,全量代码可参考完整代码章节。

①对图片进行解码

先通过上下文 context 获取到资源管理器 resourceManager,然后通过资源管理器获取到图片数据,再获取图片的 ArrayBuffer。

最后通过 ArrayBuffer 创建 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
//创建imageSource
constimageSource=image.createImageSource(buffer)
//创建PixelMap
constpixelMap=awaitimageSource.createPixelMap()
returnpixelMap
}
②编辑 pixelMap

分别通过以下方法对 pixelMap 进行裁剪、缩放、偏移、旋转、翻转、调节透明度等操作: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进行旋转
asyncrotate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.rotate(90);
this.imagePixelMap=pixelMap
}
//对pixelMap进行翻转
asyncflip_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.flip(false,true);
this.imagePixelMap=pixelMap
}
//对pixelMap进行透明度调整
asyncopacity_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.opacity(0.5);
this.imagePixelMap=pixelMap
}
③通过 Image 组件将编辑后的 pixelMap 渲染显示出来

第 2 步中将编辑好的 pixelMap 传递给状态变量 imagePixelMap,本步中直接将 imagePixelMap 传入 Image 组件进行渲染显示。

具体代码如下:

if(!this.edit){
Row(){
Image($r('app.media.httpimage')).objectFit(ImageFit.None)
}.width('100%').height('50%').backgroundColor('#F0F0F0')
}else{
Row(){
//将编辑好的pixelMap传递给状态变量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
//创建imageSource
constimageSource=image.createImageSource(buffer)
//创建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进行旋转
asyncrotate_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.rotate(90);
this.imagePixelMap=pixelMap
}

//对pixelMap进行翻转
asyncflip_image(){
letpixelMap=awaitthis.get_pixelmap()
pixelMap.flip(false,true);
this.imagePixelMap=pixelMap
}

//对pixelMap进行透明度调整
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传递给状态变量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:'旋转',action:this.rotate_image()})
this.buttonModel({textContent:'翻转',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%')
}
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相机
    +关注

    关注

    4

    文章

    1253

    浏览量

    52452
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66767
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44696
  • OpenHarmony
    +关注

    关注

    23

    文章

    3290

    浏览量

    15159

原文标题:OpenHarmony上实现“图片编辑”功能

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    HarmonyOS开发案例:【图片编辑

    基于canvas组件、图片编解码,介绍了图片编辑实现过程。
    的头像 发表于 04-22 16:42 357次阅读
    HarmonyOS开发案例:【<b class='flag-5'>图片</b><b class='flag-5'>编辑</b>】

    ad9编辑原理图出现图片的错误

    ad9编辑原理图出现图片的错误哪位大神指点
    发表于 05-03 18:40

    HarmonyOS教程—基于图片处理能力,实现一个图片编辑模板

    1. 介绍在日常生活中有很多APP都有图片编辑功能,但由于APP间存在一定的功能差异,开发者往往要为每个APP单独实现一套
    发表于 08-31 10:13

    OpenHarmony 3.0 LTS 新增特性功能

    本帖最后由 soon顺soon 于 2021-10-7 21:36 编辑 期待已久的轻量级分布式要来了?https://gitee.com/openharmony/docs/blob
    发表于 09-30 08:24

    为什么要在OpenHarmony设备安装Dropbear呢

    个ssh服务器的实现软件,同时具有ssh客户端的功能。dropbear通常在嵌入式Linux运行,例如大名鼎鼎的OpenWRT默认的ssh的服务器和客户端正是dropbear。为什么需要
    发表于 05-23 17:45

    app图标动效在openharmony的源码哪里实现的?

    openharmony点击一个app图标的之后,应用会从左上角一点点放大直至铺满屏幕;我想问一下这个动效是在openharmony的源码的哪里实现的?
    发表于 06-10 11:01

    openharmony怎么调用芯片里的GPU进行视频和图片的编解码?

    openharmony怎么调用芯片里的GPU进行视频和图片的编解码? 比如RK3588等。openharmony 3.2 Release。
    发表于 08-14 15:04

    尼康推出全新视频和图片浏览编辑软件

    今日,尼康公司宣布推出全新视频和图片浏览编辑软件——NX Studio(1.0版),该软件能够实现无缝浏览、处理和编辑用尼康数码相机拍摄的照片和视频的新软件,并且从今日起可免费下载。
    的头像 发表于 03-05 09:37 2624次阅读

    基于openharmony Span实现富文本多种样式编辑

    项目介绍 项目名称:Ohos-Rich-text-Editor 所属系列:openharmony的第三方组件适配移植 功能:Span实现富文本多种样式的编辑 项目移植状态:主
    发表于 03-21 09:26 1次下载

    基于openharmony移植的图片加蒙层库

    项目介绍 项目名称:ohos_maskable_layout 所属系列:openharmony的第三方组件适配移植 功能:给图片加蒙层的库,如图片加圆形,星形蒙层,以及蒙层动画 项目移
    发表于 03-21 14:03 1次下载
    基于<b class='flag-5'>openharmony</b>移植的<b class='flag-5'>图片</b>加蒙层库

    基于openharmony适配移植的图片加载器

    项目介绍 项目名称:Sketch 所属系列:openharmony的第三方组件适配移植 功能:一款强大且全面的图片加载器,除了图片加载的必备功能
    发表于 03-22 14:41 3次下载

    OpenHarmony生态论坛:基于OpenHarmony的HarmonyOS Connect定位

    OpenHarmony生态论坛:基于OpenHarmony的HarmonyOS Connect定位   审核编辑:彭菁  
    的头像 发表于 04-25 14:34 1251次阅读
    <b class='flag-5'>OpenHarmony</b>生态论坛:基于<b class='flag-5'>OpenHarmony</b>的HarmonyOS Connect定位

    OpenHarmony生态论坛:翱捷IoT与OpenHarmony互利共赢

    OpenHarmony生态论坛:奥捷IoT与OpenHarmony互利共赢         审核编辑:彭菁  
    的头像 发表于 04-25 16:29 1137次阅读
    <b class='flag-5'>OpenHarmony</b>生态论坛:翱捷IoT与<b class='flag-5'>OpenHarmony</b>互利共赢

    OpenHarmony PhotoView组件的介绍

    PhotoView是OpenAtom OpenHarmony(简称“OpenHarmony”)系统的一款图片缩放及浏览的三方组件,用于声明式应用开发,支持图片缩放、平移、旋转等
    的头像 发表于 09-09 10:04 820次阅读

    HarmonyOS开发案例:【图片编辑

    基于ArkTS的声明式开发范式的样例,主要介绍了图片编辑实现过程。
    的头像 发表于 04-23 20:54 30次阅读
    HarmonyOS开发案例:【<b class='flag-5'>图片</b><b class='flag-5'>编辑</b>】