1 个回答

这里有个保存showAssetsCreationDialog的demo:

import { common } from '@kit.AbilityKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { image } from '@kit.ImageKit';
import fs, { ReadOptions, WriteOptions } from '@ohos.file.fs'
import { BusinessError } from '@kit.BasicServicesKit';

let context = getContext(this) as common.UIAbilityContext;
let cacheDir = context.cacheDir;

async function example() {
  console.info('ShowAssetsCreationDialogDemo.');
  let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
  try {
    // 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
    let srcFileUris: Array<string> = [
      'file://'+cacheDir+"/pixel_map3.jpg"// 实际场景请使用真实的uri
    ];
    let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
      {
        title: 'test3', // 可选
        fileNameExtension: 'jpg',
        photoType: photoAccessHelper.PhotoType.IMAGE,
        subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
      }
    ];
    let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
    console.info('showAssetsCreationDialog success, data is ' + desFileUris);
    let destFile = await fs.open(desFileUris.toString(), fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    // 打开文件
    let srcFile = fs.openSync(cacheDir + '/pixel_map3.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    // 读取源文件内容并写入至目的文件
    let bufSize = 4096;
    let readSize = 0;
    let buf = new ArrayBuffer(bufSize);
    let readOptions: ReadOptions = {
      offset: readSize,
      length: bufSize
    };
    let readLen = fs.readSync(srcFile.fd, buf, readOptions);
    while (readLen > 0) {
      readSize += readLen;
      let writeOptions: WriteOptions = {
        length: readLen
      };
      fs.writeSync(destFile.fd, buf, writeOptions);
      readOptions.offset = readSize;
      readLen = fs.readSync(srcFile.fd, buf, readOptions);
    }
    // 关闭文件
    fs.closeSync(srcFile);
    fs.closeSync(destFile);
  } catch (err) {
    console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
  }
}

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State pixelMap: image.PixelMap | undefined = undefined
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  test1(pixelMap: image.PixelMap) {
    const context: Context = getContext();
    console.log(cacheDir+"/pixel_map3.jpg")
    const path: string = context.cacheDir + "/pixel_map3.jpg";
    let packOpts: image.PackingOption = { format: "image/jpeg", quality: 98 }
    let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
    const imagePackerApi: image.ImagePacker = image.createImagePacker();
    imagePackerApi.packToFile(pixelMap, file.fd, packOpts, (err: BusinessError) => {
      if (err) {
        console.error('packToFile failed.');
      } else {
        console.info('packToFile succeeded.');
      }
    })
  }
  build() {
    Column() {
      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
        Text('已保存到沙箱路径cache文件夹下')
        Canvas(this.context)
          .width('100%')
          .height('50%')
          .backgroundColor('#F5DC62')
          .onReady(() => {
            //创建一个径向渐变色的CanvasGradient对象
            let grad = this.context.createRadialGradient(200, 200, 50, 200, 200, 200)
            //为CanvasGradient对象设置渐变断点值,包括偏移和颜色
            grad.addColorStop(0.0, '#E87361');
            grad.addColorStop(0.5, '#FFFFF0');
            grad.addColorStop(1.0, '#BDDB69');
            //用CanvasGradient对象填充矩形
            this.context.fillStyle = grad;
            this.context.fillRect(0, 0, 400, 400);
            this.pixelMap = this.context.getPixelMap(0, 0, 400, 400)
            this.test1(this.pixelMap)
          })
        Button("保存图片")
          .onClick(() => {
            example()
          })
      }
    }
    .width('100%')
    .height('100%')
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进