HarmonyOS鸿蒙Next中ImageReceiver获取预览流图片时,保存到本地图片格式错误

HarmonyOS鸿蒙Next中ImageReceiver获取预览流图片时,保存到本地图片格式错误 ImageReceiver获取预览流图片时,保存到本地图片格式错误

3 回复

参考下面的Demo:

生成yuv格式的图片:

async yuv(receiver: image.ImageReceiver): Promise<void> {
  receiver.on('imageArrival', () => {
  console.error("imageArrival callback");
  receiver.readNextImage((err, nextImage: image.Image) => {
  let a = nextImage.format
  nextImage.getComponent(image.ComponentType.JPEG, (err: BusinessError, imgComponent: image.Component) => {
  if (err || imgComponent === undefined) {
  // CLog.error('getComponent failed');
}
if (imgComponent) {
  let path: string = getContext().filesDir + "/image1.yuv";
  if (fileIo.accessSync(path)) {
    fileIo.rmdirSync(path)
  }
  let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
  let opt: WriteOptions = {
    // 多出2048字节数据
    length: imgComponent.byteBuffer.byteLength
  }
  fileIo.writeSync(file.fd, imgComponent.byteBuffer, opt)
  fileIo.close(file)
} else {
  // CLog.error('byteBuffer is null');
}
})
})
})
}

如果想获取JPEG,参考这个demo:

async onImageArrival(receiver: image.ImageReceiver): Promise<void> {
  receiver.on('imageArrival', () => {
  console.error("imageArrival callback");
  receiver.readNextImage((err, nextImage: image.Image) => {
  nextImage.getComponent(image.ComponentType.JPEG, async (err, imgComponent: image.Component) => {
  if (err || imgComponent === undefined) {
  return;
}

if (imgComponent.byteBuffer as ArrayBuffer) {
  let sourceOptions: image.SourceOptions = {
    sourceDensity: 120,
    sourcePixelFormat: 8, // NV21
    sourceSize: {
      height: this.previewProfilesObj2!.size.height,
      width: this.previewProfilesObj2!.size.width
    },
  }
  let imageResource = image.createImageSource(imgComponent.byteBuffer, sourceOptions);
  // // 设置参数
  let decodingOptions: image.DecodingOptions = {
    sampleSize:1, // 缩略图采样大小
    editable: true, // 是否可编辑
    desiredSize:{ width:500, height:500}, // 期望输出大小
    rotate: 270, // 旋转角度
    desiredPixelFormat:8, // 解码的像素格式
    desiredRegion: { size: { height:500, width:500 }, x: 0, y: 0 }, // 解码的区域
    index:0 // 图片序号
  };
  imageResource.createPixelMap(decodingOptions).then((res)=>{
    this.imgUrl = res;
  });
} else {
  return;
}
nextImage.release();
})
})
})
}

更多关于HarmonyOS鸿蒙Next中ImageReceiver获取预览流图片时,保存到本地图片格式错误的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用ImageReceiver获取预览流图片时,如果保存到本地的图片格式错误,可能是由于未正确设置图片的编码格式或未正确处理图像数据。ImageReceiver通常用于接收相机预览流数据,获取到的图像数据是Image对象,保存时需要将Image对象转换为指定的图片格式(如JPEG或PNG)。

在保存图片时,可以通过Image对象的getComponent方法获取图像的像素数据,然后使用ImagePackerPixelMap进行编码。如果未指定编码格式或格式不正确,可能会导致保存的图片格式错误。确保在编码时使用正确的格式参数,如ImageFormat.JPEGImageFormat.PNG。此外,检查文件扩展名是否与编码格式匹配,避免保存时格式不一致。

如果问题仍然存在,可能需要检查ImageReceiver的配置或图像处理流程是否存在问题。

在HarmonyOS鸿蒙Next中,使用ImageReceiver获取预览流图片时,若保存到本地的图片格式错误,可能是由于编码格式或保存方式不正确。建议检查以下步骤:

  1. 确保ImageReceiverImageFormat设置正确。
  2. 使用PixelMap将图像数据转换为正确的格式。
  3. 保存时,通过ImagePacker指定正确的图片格式(如JPEG或PNG)。
  4. 检查文件路径和权限,确保有写入权限。

示例代码:

ImagePacker imagePacker = ImagePacker.create();
ImagePacker.PackingOptions options = new ImagePacker.PackingOptions();
options.format = "image/jpeg"; // 指定格式
imagePacker.pack(pixelMap, options, file); // 保存到文件

如问题仍未解决,请检查API版本或查阅官方文档。

回到顶部