HarmonyOS 鸿蒙Next 有没有选好的图片返回后直接进行裁剪然后保存到私有目录下的函数

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 有没有选好的图片返回后直接进行裁剪然后保存到私有目录下的函数

问一下,有没有直接可以对图片进行裁剪大小,如: tmp_locpic 就是我选择图片的地址,下面的代码是直接把图片复制到私有目录,我想复制过去时直接对这个图片进行裁剪保存  
 

let tmp_resFile:fs.File;

tmp_resFile = fs.openSync(tmp_locpic, fs.OpenMode.READ_ONLY);

fs.copyFileSync(tmp_resFile.fd, tmp_cachename);

let tmp_cacheFile = fs.openSync(tmp_cachename, fs.OpenMode.READ_ONLY);

// 使用本地路径打开文件

更多关于HarmonyOS 鸿蒙Next 有没有选好的图片返回后直接进行裁剪然后保存到私有目录下的函数的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

可以使用ImageKnife,它是基于OpenHarmony的图片处理三方库,可以定义裁剪效果。 三方库链接:https://gitee.com/openharmony-tpc/ImageKnife 也可以参考:https://developer.huawei.com/consumer/cn/codelabsPortal/carddetails/tutorials_NEXT-ImageEdit

import { BusinessError } from '@ohos.base';

import image from '@ohos.multimedia.image';

import fs from '@ohos.file.fs';

let path: string = getContext().filesDir + "/hehe.jpg";

let decodingOptions: image.DecodingOptions = {

  editable: true,

  desiredPixelFormat: 3,

}

@Entry

@Component

struct Index {

  @State pixelMap: PixelMap | undefined = undefined;

  @State pixelMap2: PixelMap | undefined = undefined;

  /**

   * 初始化图片资源到沙箱

   * @returns

   */

  async aboutToAppear(): Promise<void> {

    const resourceManager = getContext(this).resourceManager

    const imageArray = await resourceManager.getMediaContent($r('app.media.123')); // 换成自己的图片

    let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

    fs.write(file.fd, imageArray.buffer).then((writeLen) => {

      console.info("write data to file succeed and size is:" + writeLen);

      fs.closeSync(file);

    }).catch((err: BusinessError) => {

      console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code);

    });

  }

  /**

   * @param px

   * @param targetWidth

   * @param targetHeight

   */

  async packingDetail(targetWidth: number, targetHeight: number) {

    if (this.pixelMap) {

      let imageInfo = await this.pixelMap.getImageInfo();

      //计算压缩比

      let scaleX: number = targetWidth / imageInfo.size.width;

      let scaleY: number = targetHeight / imageInfo.size.height;

      this.pixelMap.scaleSync(scaleX, scaleY)

    }

  }

  build() {

    Row() {

      Column() {

        Image(this.pixelMap)

          .width(200)

          .height(200)

          .backgroundColor(Color.Red)

          .margin({ bottom: 40 })

          .objectFit(ImageFit.Contain)

        Button('1:3').onClick(async () => {

          // path为已获得的沙箱路径

          const imageSource: image.ImageSource = image.createImageSource(path);

          //创建pixelMap

          this.pixelMap = await imageSource.createPixelMap(decodingOptions);

          //指定压缩宽、高

          this.packingDetail(100, 300)

        }).margin({bottom: 20})

        Button('1:2').onClick(async () => {

          // path为已获得的沙箱路径

          const imageSource: image.ImageSource = image.createImageSource(path);

          //创建pixelMap

          this.pixelMap = await imageSource.createPixelMap(decodingOptions);

          //指定压缩宽、高

          this.packingDetail(100, 200)

        })

      }

      .width('100%')

    }

    .height('100%')

  }

}

更多关于HarmonyOS 鸿蒙Next 有没有选好的图片返回后直接进行裁剪然后保存到私有目录下的函数的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next 提供了对图片操作的一系列API,其中包括选择图片、裁剪图片以及保存到私有目录的功能。对于你的需求,虽然没有直接的单一函数可以实现这一连串操作,但可以通过组合使用相关API来实现。

你可以使用MediaStore API来选择图片,获取图片的URI后,利用CanvasBitmap类进行裁剪处理。裁剪完成后,使用FileFileOutputStream将图片保存到应用的私有目录下。具体步骤如下:

  1. 选择图片:通过MediaStore查询并展示图片供用户选择。
  2. 裁剪图片:获取图片后,使用BitmapFactory解码为Bitmap,再用Bitmap.createBitmap进行裁剪。
  3. 保存图片:在应用的私有目录下创建文件,使用FileOutputStream将裁剪后的Bitmap保存为图片文件。

示例代码需根据具体需求编写,但上述步骤涵盖了从选择到裁剪再到保存的基本流程。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部