HarmonyOS 鸿蒙Next 如何把Colum布局绘制成一张图片并且保存到本地

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何把Colum布局绘制成一张图片并且保存到本地 现在是想把Colum布局绘制成一张图片并且保存到本地,有没有代码案例

3 回复
import { componentSnapshot, display } from '@kit.ArkUI';
import { image } from '@kit.ImageKit';
import { fileIo as fs, fileUri } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';

@Entry
@Component
struct Page_241119085813097 {
  @State message: string = 'Hello World';
  @State pixmap: image.PixelMap | undefined = undefined

  build() {
    Column(){

     Column(){
       Text(this.message)
         .height('300px')
         .width('100%')
         .fontSize(20)

       .backgroundColor(Color.Gray)

       Text(this.message)
         .height('300px')
         .width('100%')
         .fontSize(20)
       .backgroundColor(Color.Blue)

       Text(this.message)
         .height('300px')
         .width('100%')
         .fontSize(20)
       .backgroundColor(Color.Pink)
     }.id("root")

      Button("将column保存到本地")
        .onClick(() =>{
          componentSnapshot.get("root", {scale : 1, waitUntilRenderFinished : true})
            .then((pixelMap: image.PixelMap) => {
              let fileName  = Date.now().toString()
              let imageFile = fs.openSync(getContext().tempDir+"/"+ fileName + ".jpg", fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE)
              image.createImagePacker().packToFile(pixelMap, imageFile.fd, {
                format: "image/jpeg",
                quality: 100,
              }).then(async () =>{
                const context = getContext(this);
                let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context)
                let srcFileUri: Array<string> = [fileUri.getUriFromPath(getContext().tempDir+"/"+ fileName + ".jpg")]
                console.debug(`图片 uri is : ${JSON.stringify(srcFileUri)}`)
                let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
                  {
                    title: '保存图片',
                    fileNameExtension: 'jpg',
                    photoType: photoAccessHelper.PhotoType.IMAGE,
                  }
                ]
                let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUri, photoCreationConfigs)
                console.debug(`目标图片 uri is : ${JSON.stringify(desFileUris)}`)
                if (desFileUris.length > 0) {
                  //文件拷贝
                  for (let index = 0; index < desFileUris.length; index++) {
                    let srcFile = fs.openSync(srcFileUri[index], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
                    let destFile = fs.openSync(desFileUris[index], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
                    fs.copyFileSync(srcFile.fd,destFile.fd)
                    fs.closeSync(srcFile);
                    fs.closeSync(destFile);
                  }
                } else {
                  console.log("11")
                }

                fs.closeSync(imageFile);
              })
              this.pixmap = pixelMap

              pixelMap.release(); // PixelMap使用完后及时释放内存

            }).catch((err:Error) => {
            console.log("error: " + err)
          })
        }).width("100%")
    }
    .height('100%')
    .width('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next 如何把Colum布局绘制成一张图片并且保存到本地的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个可以使用组件截图功能实现。示例可以参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkui-315-V5

在HarmonyOS鸿蒙系统中,将Colum布局绘制成一张图片并保存到本地,可以通过以下步骤实现:

  1. 获取Canvas并绘制布局: 首先,你需要创建一个Canvas对象,并获取到Colum布局的Paint对象。然后,使用Canvas的draw()方法将Colum布局绘制到Canvas上。

  2. 创建Bitmap并保存: 接着,创建一个Bitmap对象,其大小应与Canvas相匹配。然后,使用Canvas的setBitmap()方法将Bitmap设置到Canvas上,这样绘制的内容就会被绘制到Bitmap中。最后,使用Bitmap的compress()方法将Bitmap压缩为图片格式(如PNG或JPEG),并保存到本地存储。

  3. 保存图片到本地: 使用FileOutputStream将压缩后的图片数据写入到指定的文件中。确保你有写入存储的权限,并在必要时请求用户授权。

示例代码(伪代码,具体实现需根据HarmonyOS API调整):

// 假设canvas和columLayout已初始化
Canvas canvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(...); // 创建与canvas大小相同的bitmap
canvas.setBitmap(bitmap);
columLayout.draw(canvas); // 将colum布局绘制到canvas上

// 保存bitmap到本地
FileOutputStream fos = new FileOutputStream("path/to/save/image.png");
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();

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

回到顶部