HarmonyOS 保存图片的时候按照某个形状裁剪(非规则图形即异形图)

对图片按照某个具体的形状进行裁剪,比如水滴的形状或者花朵的形状,用pixelMap实现。

HarmonyOS
2025-01-09 14:17:20
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

参考下这个demo:

import { photoAccessHelper } from '@kit.MediaLibraryKit'
import fs from '@ohos.file.fs';
import { util } from '@kit.ArkTS';
@Entry
@Component
struct GlobalCompositeOperation {
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  private offCanvas: OffscreenCanvas = new OffscreenCanvas(600, 600)
  private img:ImageBitmap = new ImageBitmap("ic_public_refresh.png") //mask
  private img2:ImageBitmap = new ImageBitmap("background.png") //原图
  private offContext = this.offCanvas.getContext("2d", this.settings)
  private image?:ImageBitmap = undefined
  @State imageURL?:string = undefined
  @State canvasWidth:number = 0
  @State canvasHeight:number = 0


  aboutToAppear(): void {
    this.canvasWidth = this.img2.width
    this.canvasHeight = this.img2.height
    console.log(`${this.canvasWidth }`)
    console.log(`${this.canvasHeight }`)
  }

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .backgroundColor(Color.Yellow)
        .width(this.canvasWidth)
        .height(this.canvasHeight)
        .onReady(() =>{
          this.offContext.drawImage(this.img2, 0, 0, this.canvasWidth, this.canvasHeight, 0, 0,this.canvasWidth, this.canvasHeight)
          this.image = this.offCanvas.transferToImageBitmap()
          this.context.transferFromImageBitmap(this.image)
        })


      Button('遮罩').onClick(() => {
        this.offContext.drawImage(this.img, 0, 0, this.img.width, this.img.height, 0, 0, this.img.width, this.img.height)
        this.image = this.offCanvas.transferToImageBitmap()
        this.context.transferFromImageBitmap(this.image)
      })
      Button('裁剪').onClick(() =>{
        this.context.reset()
        this.offContext.drawImage(this.img2, 0, 0, this.canvasWidth, this.canvasHeight, 0, 0,this.canvasWidth, this.canvasHeight)
        this.offContext.globalCompositeOperation = 'destination-in'
        this.offContext.drawImage(this.img, 0, 0, this.img.width, this.img.height, 0, 0, this.img.width, this.img.height)
        this.image = this.offCanvas.transferToImageBitmap()
        this.context.transferFromImageBitmap(this.image)
        this.canvasWidth = this.img.width
        this.canvasHeight = this.img.height
      })
      SaveButton().onClick(async () =>{
        try {
          this.imageURL = this.context.toDataURL()
          let base64Helper = new util.Base64Helper()
          let imageStr = this.imageURL.split(',')
          let arrayBuffer = base64Helper.decodeSync(imageStr[1], util.Type.MIME).buffer as ArrayBuffer
          const context = getContext(this)
          let helper = photoAccessHelper.getPhotoAccessHelper(context)
          let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg')
          let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
          await fs.write(file.fd, arrayBuffer);
          // 关闭文件
          await fs.close(file.fd);
        } catch (error) {
          console.error("error is " + JSON.stringify(error))
        }
      })


      // Image(this.imageURL!).width(this.img.width).height(this.img.height)
    }
    .width('100%')
    .height('100%')
  }
}
分享
微博
QQ
微信
回复
2025-01-09 16:54:52
相关问题
HarmonyOS规则形状裁剪
419浏览 • 1回复 待解决
HarmonyOS 图片裁剪问题
299浏览 • 1回复 待解决
HarmonyOS 选择图片裁剪功能
512浏览 • 1回复 待解决
HarmonyOS 如何关闭栈顶某个Page?
204浏览 • 1回复 待解决
HarmonyOS 如何进行图片裁剪
355浏览 • 1回复 待解决
HarmonyOS 有没有图片裁剪控件?
393浏览 • 1回复 待解决
HarmonyOS 图片浏览和裁剪视图组件
276浏览 • 1回复 待解决
如何编辑裁剪相册中图片
1223浏览 • 1回复 待解决
如何实现图片裁剪、旋转
943浏览 • 1回复 待解决
HarmonyOS 有没有图片裁剪demo或者sdk
209浏览 • 1回复 待解决
HarmonyOS image如何把图片裁剪成圆形
301浏览 • 1回复 待解决
想要实现一个图片裁剪功能
834浏览 • 1回复 待解决