HarmonyOS鸿蒙Next中ImageReceiver获取预览流图片时,保存到本地图片格式错误
HarmonyOS鸿蒙Next中ImageReceiver获取预览流图片时,保存到本地图片格式错误 ImageReceiver获取预览流图片时,保存到本地图片格式错误
参考下面的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方法获取图像的像素数据,然后使用ImagePacker或PixelMap进行编码。如果未指定编码格式或格式不正确,可能会导致保存的图片格式错误。确保在编码时使用正确的格式参数,如ImageFormat.JPEG或ImageFormat.PNG。此外,检查文件扩展名是否与编码格式匹配,避免保存时格式不一致。
如果问题仍然存在,可能需要检查ImageReceiver的配置或图像处理流程是否存在问题。
在HarmonyOS鸿蒙Next中,使用ImageReceiver获取预览流图片时,若保存到本地的图片格式错误,可能是由于编码格式或保存方式不正确。建议检查以下步骤:
- 确保
ImageReceiver的ImageFormat设置正确。 - 使用
PixelMap将图像数据转换为正确的格式。 - 保存时,通过
ImagePacker指定正确的图片格式(如JPEG或PNG)。 - 检查文件路径和权限,确保有写入权限。
示例代码:
ImagePacker imagePacker = ImagePacker.create();
ImagePacker.PackingOptions options = new ImagePacker.PackingOptions();
options.format = "image/jpeg"; // 指定格式
imagePacker.pack(pixelMap, options, file); // 保存到文件
如问题仍未解决,请检查API版本或查阅官方文档。

