HarmonyOS鸿蒙Next中ArrayBuffer存相册是一张空图片
HarmonyOS鸿蒙Next中ArrayBuffer存相册是一张空图片 您好,我通过相机流取到的数据,保存到相册,是一张空图片,请问是哪出了问题
可参考如下demo:
import { BusinessError } from '@kit.BasicServicesKit';
import { camera } from '@kit.CameraKit';
import { image } from '@kit.ImageKit';
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
// 同时将权限配置到 module.json5
const permissions: Array<Permissions> = ['ohos.permission.MICROPHONE','ohos.permission.CAMERA','ohos.permission.WRITE_MEDIA',
'ohos.permission.READ_MEDIA']
@Entry
@Component
struct Index {
private xcomponentController: XComponentController = new XComponentController;
@State imagePixelMap: image.PixelMap | undefined = undefined
@State surfaceId: string = '';
@State face:number=0
@State previewProfilesObj2Com: camera.Profile | undefined = undefined
aboutToAppear(){
let context = getContext(this) as common.UIAbilityContext;
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(context, permissions).then((data) => {
}).catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
})
}
build() {
Column() {
Row() {
XComponent({
id: 'xcomponent', type: XComponentType.SURFACE, controller: this.xcomponentController })
.onLoad(() => {
this.xcomponentController.setXComponentSurfaceSize({ surfaceWidth: 1920, surfaceHeight: 1080 });
this.surfaceId = this.xcomponentController.getXComponentSurfaceId()
this.previewCameraTwo(getContext(this), this.surfaceId,false);
})
.width('70%')
.height('50%')
}.backgroundColor(Color.Black).width('100%')
Image(this.imagePixelMap)
.enableAnalyzer(true)
.width("100%")
.height('50%').backgroundColor(Color.Yellow)
.objectFit(ImageFit.None)
}
}
//双录浏览
async previewCameraTwo(baseContext: common.BaseContext, surfaceId: string,cameraDevice:boolean): Promise<void> {
//获取CameraManager
let cameraManager: camera.CameraManager = camera.getCameraManager(baseContext);
//获取相机列表
let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();
//创建相机输入流
let cameraInput: camera.CameraInput | undefined = undefined;
//0 后置摄像头 1前置摄像头
cameraInput = cameraManager.createCameraInput(cameraArray[0]);
//获取相机设备支持的输出流能力
let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0],1);
let metadataObjectTypes:Array<camera.MetadataObjectType> = cameraOutputCap.supportedMetadataObjectTypes;
let previewProfilesArray: Array<camera.Profile> = cameraOutputCap.previewProfiles;
//创建预览输出流
let previewOutput: camera.PreviewOutput | undefined = undefined;
let previewOutput2: camera.PreviewOutput | undefined = undefined;
let metadataOutput: camera.MetadataOutput | undefined = undefined;
this.previewProfilesObj2Com = previewProfilesArray[0];
let size: image.Size = { width: previewProfilesArray[0].size.width, height: previewProfilesArray[0].size.height }
let receiver: image.ImageReceiver = image.createImageReceiver(size, image.ImageFormat.JPEG, -1);
let imageReceiverSurfaceId: string = await receiver.getReceivingSurfaceId();
previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId);
previewOutput2 = cameraManager.createPreviewOutput(previewProfilesArray[0], imageReceiverSurfaceId);
metadataOutput = cameraManager.createMetadataOutput(metadataObjectTypes)
//打开相机
await cameraInput.open();
//创建会话
let captureSession: camera.PhotoSession | undefined = undefined;
captureSession = cameraManager.createSession(1) as camera.PhotoSession;
//开始配置会话
captureSession.beginConfig();
// 向会话中添加相机输入流
captureSession.addInput(cameraInput);
// 向会话中添加预览输出流
captureSession.addOutput(previewOutput);
captureSession.addOutput(previewOutput2);
captureSession.addOutput(metadataOutput);
// 提交会话配置
await captureSession.commitConfig();
// 启动会话
await captureSession.start();
metadataOutput.on('error', (metadataOutputError: BusinessError) => {
console.error(`Metadata output error code: ${metadataOutputError.code}`);
});
metadataOutput.on('metadataObjectsAvailable', (err: BusinessError, metadataObjectArr: Array<camera.MetadataObject>) => {
console.info('metadataObjectsAvailable',metadataObjectArr.length);
});
receiver.on('imageArrival', () => {
receiver.readNextImage((err: BusinessError, nextImage: image.Image) => {
if (err || nextImage === undefined) {
console.error('readNextImage failed');
return;
}
nextImage.getComponent(image.ComponentType.JPEG, async (err: BusinessError, imgComponent: image.Component) => {
if (err || imgComponent === undefined) {
console.error('getComponent failed');
}
if (imgComponent && imgComponent.byteBuffer as ArrayBuffer) {
let opts: image.DecodingOptions = { editable: true, desiredPixelFormat: 3 };
if(this.previewProfilesObj2Com == undefined) {
return;
}
let sourceOptions : image.SourceOptions = {
sourceDensity: 120,
sourcePixelFormat: 8, // NV21
sourceSize: {
height: this.previewProfilesObj2Com.size.height,
width: this.previewProfilesObj2Com.size.width
}
}
let imageResource = image.createImageSource(imgComponent.byteBuffer,sourceOptions);
imageResource.createPixelMap(opts, (err: BusinessError, pixelMap: image.PixelMap) => {
if (err != undefined) {
console.error(`Failed to create pixelMap.code is ${ JSON.stringify(err)}`);
} else {
pixelMap.rotate(90).then(() =>{
this.imagePixelMap = pixelMap;
})
console.info('Succeeded in creating pixelMap object.');
}
})
} else {
console.error('byteBuffer is null');
}
nextImage.release();
})
})
})
}
}
更多关于HarmonyOS鸿蒙Next中ArrayBuffer存相册是一张空图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,ArrayBuffer
是用于处理二进制数据的对象。如果你将ArrayBuffer
保存为相册中的图片,但结果显示为一张空图片,可能是由于以下原因:
-
数据格式不匹配:
ArrayBuffer
中的数据可能不符合图片格式(如JPEG、PNG等)的规范,导致系统无法正确解析并生成图片。 -
数据损坏:
ArrayBuffer
中的二进制数据可能在传输或处理过程中被损坏,导致无法生成有效的图片文件。 -
编码问题:如果
ArrayBuffer
中的数据未正确编码为图片格式,系统无法识别并生成图片。 -
文件写入错误:在将
ArrayBuffer
写入文件时,可能发生了错误,导致文件内容为空或不完整。
要解决此问题,确保ArrayBuffer
中的数据是有效的图片格式,并且在写入文件时没有发生错误。可以使用鸿蒙提供的Image
或ImageSource
相关API来处理和验证图片数据。
在HarmonyOS鸿蒙Next中,如果ArrayBuffer存储的相册图片显示为空,可能是以下原因之一:
- ArrayBuffer数据未正确加载或损坏;
- 图片解码失败,可能由于格式不支持或数据不完整;
- 内存分配或处理过程中出现错误。
建议检查数据源完整性、确保使用支持的图片格式,并调试相关代码以确认数据处理流程无误。