HarmonyOS鸿蒙Next中ArrayBuffer存相册是一张空图片

HarmonyOS鸿蒙Next中ArrayBuffer存相册是一张空图片 您好,我通过相机流取到的数据,保存到相册,是一张空图片,请问是哪出了问题

3 回复

可参考如下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保存为相册中的图片,但结果显示为一张空图片,可能是由于以下原因:

  1. 数据格式不匹配:ArrayBuffer中的数据可能不符合图片格式(如JPEG、PNG等)的规范,导致系统无法正确解析并生成图片。

  2. 数据损坏:ArrayBuffer中的二进制数据可能在传输或处理过程中被损坏,导致无法生成有效的图片文件。

  3. 编码问题:如果ArrayBuffer中的数据未正确编码为图片格式,系统无法识别并生成图片。

  4. 文件写入错误:在将ArrayBuffer写入文件时,可能发生了错误,导致文件内容为空或不完整。

要解决此问题,确保ArrayBuffer中的数据是有效的图片格式,并且在写入文件时没有发生错误。可以使用鸿蒙提供的ImageImageSource相关API来处理和验证图片数据。

在HarmonyOS鸿蒙Next中,如果ArrayBuffer存储的相册图片显示为空,可能是以下原因之一:

  1. ArrayBuffer数据未正确加载或损坏;
  2. 图片解码失败,可能由于格式不支持或数据不完整;
  3. 内存分配或处理过程中出现错误。

建议检查数据源完整性、确保使用支持的图片格式,并调试相关代码以确认数据处理流程无误。

回到顶部