HarmonyOS鸿蒙Next中如何对拍下照片或相册选中的图片进行压缩并保存的代码示例

HarmonyOS鸿蒙Next中如何对拍下照片或相册选中的图片进行压缩并保存的代码示例 需要一个对拍下照片或者相册选中的图片进行压缩后并保存的代码示例

4 回复

相机拍照+图库图片选择保存的Demo:

Index页面:

const TAG = '[CameraDemo]';

@Entry
@Component
struct Index {
  context: Context = getContext(this) as Context;
  @State curFile: string = '';

  build() {
    Column({
      space: 30
    }) {
      Button('拍照')
        .width(200)
        .height(30)
        .onClick(() => {
          let permissions: Array<Permissions> = [
            'ohos.permission.CAMERA',
            'ohos.permission.WRITE_MEDIA',
            'ohos.permission.READ_MEDIA',
            'ohos.permission.MEDIA_LOCATION',
          ];
          let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
          atManager.requestPermissionsFromUser(this.context, permissions).then((data: PermissionRequestResult) => {
            let grantStatus: Array<number> = data.authResults;
            let length: number = grantStatus.length;
            for (let i = 0; i < length; i++) {
              if (grantStatus[i] != 0) {
                return;
              }
            }
            router.pushUrl({
              url: 'pages/CameraDemo'
            })
            console.info(`${TAG} Success to request permissions from user. authResults is ${grantStatus}.`);
          }).catch((err: BusinessError) => {
            console.error(`${TAG} Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
          })
          margin({ top: 30 })
        })

      Button('图库')
        .width(200)
        .height(30)
        .onClick(() => {
          this.imagePicker();
        })
        .margin({ top: 30 })
    }
    .width('100%')
    .height('100%')
  }

  imagePicker() {
    try {
      let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
      photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE;
      photoSelectOptions.maxSelectNumber = 1;
      let photoPicker = new photoAccessHelper.PhotoViewPicker();
      photoPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
        console.info(TAG, 'PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(photoSelectResult));
        this.curFile = photoSelectResult.photoUris[0];
        if (this.curFile) {
          router.pushUrl({
            url: 'pages/FilePickerDemo',
            params: { file: this.curFile, isVideo: this.isVideoType(this.curFile) }
          })
        }
      }).catch((err: BusinessError) => {
        console.error(TAG, 'PhotoViewPicker.select failed with err: ' + JSON.stringify(err));
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(TAG, 'PhotoViewPicker failed with err: ' + JSON.stringify(err));
    }
  }

  isVideoType(fileUri: string): boolean {
    try {
      let fileExtention = fileUri.substring(fileUri.lastIndexOf('.'));
      let typeId = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(fileExtention);
      if (typeId == uniformTypeDescriptor.UniformDataType.IMAGE.toString()) {
        return false;
      }

      if (typeId == uniformTypeDescriptor.UniformDataType.VIDEO.toString()) {
        return true;
      }

      let typeObj: uniformTypeDescriptor.TypeDescriptor = uniformTypeDescriptor.getTypeDescriptor(typeId);
      return typeObj.belongingToTypes.some(s => s == uniformTypeDescriptor.UniformDataType.VIDEO.toString())
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(TAG, 'isVideoType failed with err: ' + JSON.stringify(err));
    }
    return false;
  }
}

CameraDemo页面

const TAG = '[CameraDemo]';

@Entry
@Component
struct CameraDemo {
  context: Context = getContext(this) as Context;
  @State pixelMap: image.PixelMap | undefined = undefined;
  @State finalPixelMap: image.PixelMap | undefined = undefined;
  @State buffer: ArrayBuffer | undefined = undefined;
  @State surfaceId: string = '';
  @State hasPicture: boolean = false;
  @State fileNames: string[] = [];
  @State imageSize: image.Size = { width: 1920, height: 1080 };
  @State saveButtonOptions: SaveButtonOptions = {
    icon: SaveIconStyle.FULL_FILLED,
    text: SaveDescription.SAVE_IMAGE,
    buttonType: ButtonType.Capsule
  } // 设置安全控件按钮属性
  private mXComponentController: XComponentController = new XComponentController;
  private cameraManager: camera.CameraManager | undefined = undefined;
  private cameraSession: camera.PhotoSession | undefined = undefined;
  private photoOutput: camera.PhotoOutput | undefined = undefined;
  private cameraInput: camera.CameraInput | undefined = undefined;
  private previewOutput: camera.PreviewOutput | undefined = undefined;
  private previewOutput2: camera.PreviewOutput | undefined = undefined;
  private imageReceiver: image.ImageReceiver | undefined = undefined;

  aboutToAppear(): void {
    let permissions: Array<Permissions> = [
      'ohos.permission.CAMERA',
      'ohos.permission.WRITE_MEDIA',
      'ohos.permission.READ_MEDIA',
      'ohos.permission.MEDIA_LOCATION',
    ];
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(this.context, permissions).then((data: PermissionRequestResult) => {
      let grantStatus: Array<number> = data.authResults;
      let length: number = grantStatus.length;
      for (let i = 0; i < length; i++) {
        if (grantStatus[i] != 0) {
          return;
        }
      }
      console.info(`${TAG} Success to request permissions from user. authResults is ${grantStatus}.`);
    }).catch((err: BusinessError) => {
      console.error(`${TAG} Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
    })
  }

  createCameraManager() {
    let cameraManager: camera.CameraManager = camera.getCameraManager(this.context);
    if (!cameraManager) {
      console.error('CameraDemo camera.getCameraManager error');
      return;
    }
    this.cameraManager = cameraManager;

    this.cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => {
      console.info(`CameraDemo camera: ${cameraStatusInfo.camera.cameraId}, status: ${cameraStatusInfo.status}`);
    });
  }

  build() {
    Column() {
      Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start }) {
        Image($r('app.media.ic_public_back'))
          .width(30)
          .onClick(() => {
            router.back()
          })
      }

      Column({ space: 20 }) {
        if (this.hasPicture) {
          Image(this.finalPixelMap)
            .objectFit(ImageFit.Fill)
            .width('100%')
            .height(300)

          SaveButton(this.saveButtonOptions)// 创建安全控件按钮
            .onClick(async (event, result: SaveButtonOnClickResult) => {
              if (result == SaveButtonOnClickResult.SUCCESS) {
                if (this.finalPixelMap) {
                  try {
                    let phAccessHelper: photoAccessHelper.PhotoAccessHelper = photoAccessHelper.getPhotoAccessHelper(this.context);
                    let options: photoAccessHelper.CreateOptions = {
                      title: Date.now().toString()
                    };
                    let photoUri: string = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png', options);
                    console.info('CameraDemo createAsset successfully, photoUri: ' + photoUri);
                    let file: fileIo.File = fileIo.openSync(photoUri, fileIo.OpenMode.WRITE_ONLY);
                    fileIo.writeSync(file.fd, this.buffer);
                    fileIo.closeSync(file);
                    promptAction.showToast({ message: `保存成功` })
                  } catch (error) {
                    let err = error as BusinessError;
                    console.error(`CameraDemo savePicture error: ${JSON.stringify(err)}`);
                    promptAction.showToast({ message: `保存失败` })
                  }
                }
              } else {
                console.error('CameraDemo SaveButtonOnClickResult createAsset failed.');
                promptAction.showToast({ message: `保存失败` })
              }
              setTimeout(() => {
                this.hasPicture = false;
                this.finalPixelMap = undefined;
              }, 1000)
            })

        } else {
          XComponent({
            id: '',
            type: 'surface',
            libraryname: '',
            controller: this.mXComponentController
          })
            .onLoad(() => {
              this.mXComponentController.setXComponentSurfaceSize({ surfaceWidth: 1920, surfaceHeight: 1080 });
              this.surfaceId = this.mXComponentController.getXComponentSurfaceId();
              setTimeout(async () => {
                await this.prepareCamera();
              }, 500);
            })
            .width('100%')
            .height(300)
          Image(this.pixelMap)
            .objectFit(ImageFit.Fill)
            .width('100%')
            .height(300)

          Button('拍照')
            .width(200)
            .height(30)
            .onClick(async () => {
              let photoCaptureSetting: camera.PhotoCaptureSetting = {
                quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // 设置图片质量高
                rotation: camera.ImageRotation.ROTATION_0 // 设置图片旋转角度0
              }
              await this.photoOutput?.capture(photoCaptureSetting).catch((error: BusinessError) => {
                console.error(`CameraDemo Failed to capture the photo ${error.message}`); //不符合条件则进入
              })

              this.hasPicture = true;
            })
        }
      }
      .width('100%')
      .height('100%')
      .padding(15)
      .borderRadius(8)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')
  }

  async prepareCamera() {
    this.createCameraManager();

    if (!this.cameraManager) {
      console.error('CameraDemo cameraManager is undefined.');
      return;
    }

    let cameraDevices: Array<camera.CameraDevice> = [];
    try {
      cameraDevices = this.cameraManager.getSupportedCameras();
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo The getSupportedCameras call failed. error: ${JSON.stringify(err)}`)
    }

    cameraDevices.forEach((cameraDevice: camera.CameraDevice) => {
      console.info(`CameraDemo cameraId: ${cameraDevice.cameraId}, cameraPosition: ${cameraDevice.cameraPosition.toString()}, cameraType: ${cameraDevice.cameraType.toString()}, connectionType: ${cameraDevice.connectionType.toString()}`)
    })

    try {
      this.cameraInput = this.cameraManager.createCameraInput(cameraDevices[0]);
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo createCaptureSession error. error: ${JSON.stringify(err)}`);
      return
    }
    this.cameraInput.on('error', cameraDevices[0], (error: BusinessError) => {
      console.error(`CameraDemo Camera input error: ${JSON.stringify(error)}`);
    });

    try {
      await this.cameraInput.open();
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo cameraInput open error. error: ${JSON.stringify(err)}`);
    }

    let cameraSceneModes: Array<camera.SceneMode> = [];
    try {
      cameraSceneModes = this.cameraManager.getSupportedSceneModes(cameraDevices[0]);
      cameraSceneModes.forEach((cameraSceneMode: camera.SceneMode) => {
        console.info(`CameraDemo cameraSceneMode: ${cameraSceneMode.toString()}`)
      })
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo The getSupportedSceneModes call failed. error: ${JSON.stringify(err)}`)
    }

    let cameraOutputCapability: camera.CameraOutputCapability = this.cameraManager.getSupportedOutputCapability(cameraDevices[0], camera.SceneMode.NORMAL_PHOTO)
    if (!cameraOutputCapability) {
      console.error('CameraDemo cameraManager.getSupportedOutputCapability error');
      return;
    }
    this.printCameraOutputCapability(cameraOutputCapability);
    let previewProfile = cameraOutputCapability.previewProfiles[0];
    cameraOutputCapability.previewProfiles.forEach(profile => {
      if (profile.size.width == this.imageSize.width && profile.size.height == this.imageSize.height && profile.format.valueOf() == 1003) {
        previewProfile = profile;
        return;
      }
    })
    this.imageSize = previewProfile.size;
    console.info(`CameraDemo 选择的预览尺寸: [${previewProfile.size.width},${previewProfile.size.height}], format: ${previewProfile.format.valueOf()}`);

    try {
      this.previewOutput = this.cameraManager.createPreviewOutput(previewProfile, this.surfaceId);
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo createCaptureSession error. error: ${JSON.stringify(err)}`);
      return
    }
    this.previewOutput.on('error', (error: BusinessError) => {
      console.error(`CameraDemo previewOutput error: ${JSON.stringify(error)}`);
    });

    try {
      this.imageReceiver = image.createImageReceiver(this.imageSize, image.ImageFormat.JPEG, 8);
      let imageReceiverSurfaceId: string = await this.imageReceiver.getReceivingSurfaceId();
      this.previewOutput2 = this.cameraManager.createPreviewOutput(previewProfile, imageReceiverSurfaceId);
      this.onImageArrival(this.imageReceiver);
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo createImageReceiver error ${JSON.stringify(err)}`);
      return
    }
    this.previewOutput2.on('error', (error: BusinessError) => {
      console.error(`CameraDemo previewOutput2 error: ${JSON.stringify(error)}`);
    });

    try {
      let photoProfile = cameraOutputCapability.photoProfiles[0];
      cameraOutputCapability.photoProfiles.forEach(profile => {
        if (profile.size.width == this.imageSize.width && profile.size.height == this.imageSize.height && profile.format.valueOf() == 1003) {
          photoProfile = profile;
          return;
        }
      })
      this.photoOutput = this.cameraManager.createPhotoOutput(photoProfile);
      console.info(`CameraDemo 选择的拍照尺寸: [${previewProfile.size.width},${previewProfile.size.height}], format: ${previewProfile.format.valueOf()}`);
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo createPhotoOutput error ${JSON.stringify(err)}`);
    }
    if (this.photoOutput === undefined) {
      console.error('CameraDemo photoOutput is undefined.');
      return;
    }

    this.setPhotoOutputCb(this.photoOutput);

    try {
      this.cameraSession = this.cameraManager.createSession<camera.PhotoSession>(camera.SceneMode.NORMAL_PHOTO);
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo createCaptureSession error. error: ${JSON.stringify(err)}`);
      return
    }
    this.cameraSession.on('error', (error: BusinessError) => {
      console.error(`CameraDemo Capture session error: ${JSON.stringify(error)}`);
    });

    try {
      this.cameraSession.beginConfig()
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo beginConfig error. error: ${JSON.stringify(err)}`);
    }

    try {
      this.cameraSession.addInput(this.cameraInput)
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo addInput error. error: ${JSON.stringify(err)}`);
    }

    try {
      this.cameraSession.addOutput(this.previewOutput)
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo add previewOutput error. error: ${JSON.stringify(err)}`);
    }

    try {
      this.cameraSession.addOutput(this.previewOutput2)
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo add previewOutput2 error. error: ${JSON.stringify(err)}`);
    }

    try {
      this.cameraSession.addOutput(this.photoOutput);
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo add photoOutput error. error: ${JSON.stringify(err)}`);
    }

    try {
      await this.cameraSession.commitConfig();
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo captureSession commitConfig error: ${JSON.stringify(err)}`);
    }

    try {
      await this.cameraSession.start();
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo captureSession start error: ${JSON.stringify(err)}`);
    }

    this.configuringSession(this.cameraSession)
  }

  configuringSession(photoSession: camera.PhotoSession): void {
    let flashStatus: boolean = false;
    try {
      flashStatus = photoSession.hasFlash();
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo Failed to hasFlash. error: ${JSON.stringify(err)}`);
    }
    console.info(`CameraDemo Returned with the flash light support status: ${flashStatus}`);
    if (flashStatus) {
      let flashModeStatus: boolean = false;
      try {
        let status: boolean = photoSession.isFlashModeSupported(camera.FlashMode.FLASH_MODE_AUTO);
        flashModeStatus = status;
      } catch (error) {
        let err = error as BusinessError;
        console.error(`CameraDemo Failed to check whether the flash mode is supported. error: ${JSON.stringify(err)}`);
      }
      if (flashModeStatus) {
        try {
          photoSession.setFlashMode(camera.FlashMode.FLASH_MODE_AUTO);
        } catch (error) {
          let err = error as BusinessError;
          console.error(`CameraDemo Failed to set the flash mode. error: ${JSON.stringify(err)}`);
        }
      }
    }
    let focusModeStatus: boolean = false;
    try {
      let status: boolean = photoSession.isFocusModeSupported(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
      focusModeStatus = status;
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo Failed to check whether the focus mode is supported. error: ${JSON.stringify(err)}`);
    }
    if (focusModeStatus) {
      try {
        photoSession.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO);
      } catch (error) {
        let err = error as BusinessError;
        console.error(`CameraDemo Failed to set the focus mode. error: ${JSON.stringify(err)}`);
      }
    }
    let zoomRatioRange: Array<number> = [];
    try {
      zoomRatioRange = photoSession.getZoomRatioRange();
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo Failed to get the zoom ratio range. error: ${JSON.stringify(err)}`);
    }
    if (zoomRatioRange.length <= 0) {
      return;
    }
    try {
      photoSession.setZoomRatio(zoomRatioRange[0]);
    } catch (error) {
      let err = error as BusinessError;
      console.error(`CameraDemo Failed to set the zoom ratio value. error: ${JSON.stringify(err)}`);
    }
  }

  async onImageArrival(receiver: image.ImageReceiver): Promise<void> {
    receiver.on('imageArrival', () => {
      receiver.readNextImage(async (err, nextImage: image.Image) => {
        console.info(`enter CameraDemo imageArrival, nextImage: ${JSON.stringify(nextImage)}`)
        if (err || nextImage === undefined) {
          console.error(`CameraDemo imageArrival error, error is ${JSON.stringify(err)} or nextImage is undefined`)
          return;
        }
        nextImage.getComponent(image.ComponentType.JPEG, async (err, imgComponent: image.Component) => {
          if (err || imgComponent === undefined) {
            console.error(`CameraDemo getComponent error, error is ${JSON.stringify(err)} or imgComponent is undefined`)
            return;
          }
          if (imgComponent.byteBuffer as ArrayBuffer) {
            let sourceOptions: image.SourceOptions = {
              sourceDensity: 0,
              sourcePixelFormat: image.PixelMapFormat.NV21, // NV21
              sourceSize: this.imageSize
            }
            let imageSource: image.ImageSource = image.createImageSource(imgComponent.byteBuffer, sourceOptions);
            let opts: image.InitializationOptions = {
              editable: true,
              pixelFormat: image.PixelMapFormat.NV21,
              size: this.imageSize
            }
            let pixelMap = await imageSource.createPixelMap(opts);
            await pixelMap.rotate(90.0);
            this.pixelMap = pixelMap;
            await imageSource.release();
          } else {
            return;
          }
          nextImage.release()
        })
      })
    })
  }

  setPhotoOutputCb(photoOutput: camera.PhotoOutput) {
    photoOutput.on('photoAvailable', (errCode: BusinessError, photo: camera.Photo): void => {
      console.info(`CameraDemo getPhoto start. err: ${JSON.stringify(errCode)}`);
      if (errCode || photo === undefined || photo.main === undefined) {
        console.error('CameraDemo getPhoto failed');
        return;
      }
      let imageObj = photo.main;
      imageObj.getComponent(image.ComponentType.JPEG, async (errCode: BusinessError, component: image.Component): Promise<void> => {
        console.info('CameraDemo getComponent start');
        if (errCode || component === undefined) {
          console.error('CameraDemo getComponent failed');
          return;
        }
        let buffer: ArrayBuffer;
        if (component.byteBuffer) {
          buffer = component.byteBuffer;
          this.buffer = buffer;
          let sourceOptions: image.SourceOptions = {
            sourceDensity: 0, // 在不确定当前密度时传0
            sourcePixelFormat: image.PixelMapFormat.RGBA_8888,
            sourceSize: this.imageSize
          }
          let imageSource: image.ImageSource = image.createImageSource(buffer, sourceOptions);
          let opts: image.InitializationOptions = {
            editable: false,
            pixelFormat: image.PixelMapFormat.RGBA_8888,
            size: this.imageSize
          }
          let pixelMap = await imageSource.createPixelMap(opts);
          this.finalPixelMap = pixelMap;
        } else {
          console.error('CameraDemo byteBuffer is null');
          return;
        }
      });
    });
  }

  printCameraOutputCapability(cameraOutputCapability: camera.CameraOutputCapability) {
    let previewProfileArr: Array<camera.Profile> = cameraOutputCapability.previewProfiles;
    let photoProfileArr: Array<camera.Profile> = cameraOutputCapability.photoProfiles;
    let videoProfileArr: Array<camera.VideoProfile> = cameraOutputCapability.videoProfiles;
    let supportedMetadataObjectTypeArr: Array<camera.MetadataObjectType> = cameraOutputCapability.supportedMetadataObjectTypes;
    previewProfileArr.forEach((value: camera.Profile, index: number) => {
      console.info(`CameraDemo 支持的预览尺寸: [${value.size.width},${value.size.height}], format: ${value.format.valueOf()}`);
    })
    photoProfileArr.forEach((value: camera.Profile, index: number) => {
      console.info(`CameraDemo 支持的拍照尺寸: [${value.size.width},${value.size.height}], format: ${value.format.valueOf()}`);
    })
    videoProfileArr.forEach((value: camera.VideoProfile, index: number) => {
      console.info(`CameraDemo 支持的录像尺寸: [${value.size.width},${value.size.height}], 支持的帧率范围: [${value.frameRateRange.min},${value.frameRateRange.max}]`);
    })
    supportedMetadataObjectTypeArr.forEach((value: camera.MetadataObjectType, index: number) => {
      console.info(`CameraDemo 支持的metadata流类型: ${value}`);
    })
  }
}

FilePickerDemo 页面

const TAG = '[FilePickerDemo]'

@Entry
@Component
struct FilePickerDemo {
  context: Context = getContext(this) as Context;
  @State curFile: string = '';
  @State uri: string = '';
  @State isVideo: boolean = false;

  aboutToAppear(): void {
    let params = router.getParams() as Record<string, Object>;
    this.curFile = params.file as string;
    this.isVideo = params.isVideo as boolean;
  }

  build() {
    Column({
      space: 10
    }) {
      Flex({
        direction: FlexDirection.Row,
        justifyContent: FlexAlign.Start
      }) {
        Image($r('app.media.ic_public_back'))
          .width(30)
          .onClick(() => {
            router.back()
          })
      }

      if (!this.isVideo) {
        Image(this.curFile)
          .width('100%')
          .height(300)
      } else {
        Video({src: this.curFile})
          .width('100%')
          .height(300)
      }


      Button('图库')
        .onClick(() => {
          this.imagePicker();
        })

      Button('另存到文件管理器')
        .onClick(() => {
          this.saveFile2FileManager();
        })
    }
    .height('100%')
    .width('100%')
  }

  imagePicker() {
    try {
      let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
      photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE;
      photoSelectOptions.maxSelectNumber = 1;
      let photoPicker = new photoAccessHelper.PhotoViewPicker();
      photoPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
        console.info(TAG, 'FilePreviewDemo PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(photoSelectResult));
        if (photoSelectResult.photoUris && photoSelectResult.photoUris.length > 0) {
          this.curFile = photoSelectResult.photoUris[0];
          this.isVideo = this.isVideoType(this.curFile);
        }
      }).catch((err: BusinessError) => {
        console.error(TAG, 'FilePreviewDemo PhotoViewPicker.select failed with err: ' + JSON.stringify(err));
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(TAG, 'FilePreviewDemo PhotoViewPicker failed with err: ' + JSON.stringify(err));
    }
  }

  async saveFile2FileManager() {
    let fileName = new Date().getTime() + this.curFile.substring(this.curFile.lastIndexOf('.'));
    try {
      let photoPicker = new picker.PhotoViewPicker();
      let photoSaveOptions = new picker.PhotoSaveOptions();
      photoSaveOptions.newFileNames = [fileName];
      await photoPicker.save(photoSaveOptions).then(async (photoSaveResult: Array<string>) => {
        console.info(TAG, 'PhotoViewPicker.save successfully, PhotoSaveResult uri: ' + JSON.stringify(photoSaveResult));
        this.uri = photoSaveResult[0];
        await this.writeFile();
      }).catch((err: BusinessError) => {
        console.error(TAG, 'PhotoViewPicker.save failed with err: ' + JSON.stringify(err));
        return;
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(TAG, 'saveFile failed with err: ' + JSON.stringify(err));
    }
  }

  async writeFile() {
    try {
      let srcFile = fileIo.openSync(this.curFile, fileIo.OpenMode.READ_ONLY)
      let descFile = fileIo.openSync(this.uri, fileIo.OpenMode.WRITE_ONLY);
      fileIo.copyFileSync(srcFile.fd, descFile.fd)
      fileIo.closeSync(srcFile);
      fileIo.closeSync(descFile);
      promptAction.showToast({ message: `保存成功` })
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(TAG, 'saveFile2 failed with err: ' + JSON.stringify(err));
    }
  }

  isVideoType(fileUri: string): boolean {
    try {
      let fileExtention = fileUri.substring(fileUri.lastIndexOf('.'));
      let typeId = uniformTypeDescriptor.getUniformDataTypeByFilenameExtension(fileExtention);
      if (typeId == uniformTypeDescriptor.UniformDataType.IMAGE.toString()) {
        return false;
      }

      if (typeId == uniformTypeDescriptor.UniformDataType.VIDEO.toString()) {
        return true;
      }

      let typeObj: uniformTypeDescriptor.TypeDescriptor = uniformTypeDescriptor.getTypeDescriptor(typeId);
      return typeObj.belongingToTypes.some(s => s == uniformTypeDescriptor.UniformDataType.VIDEO.toString())
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(TAG, 'isVideoType failed with err: ' + JSON.stringify(err));
    }
    return false;
  }
}

更多关于HarmonyOS鸿蒙Next中如何对拍下照片或相册选中的图片进行压缩并保存的代码示例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,可以使用ImagePackerImageSource类对拍下照片或相册选中的图片进行压缩并保存。以下是一个简单的代码示例:

import image from '@ohos.multimedia.image';
import fileio from '@ohos.fileio';

async function compressAndSaveImage(imageUri: string, outputPath: string, quality: number) {
    try {
        // 创建ImageSource对象
        const imageSource = image.createImageSource(imageUri);
        
        // 从ImageSource创建PixelMap对象
        const pixelMap = await imageSource.createPixelMap();
        
        // 创建ImagePacker对象
        const imagePacker = image.createImagePacker();
        
        // 设置压缩参数
        const options = { format: "image/jpeg", quality: quality };
        
        // 压缩图片并获取压缩后的数据
        const packedData = await imagePacker.packing(pixelMap, options);
        
        // 将压缩后的数据写入文件
        const file = await fileio.open(outputPath, fileio.OpenMode.READ_WRITE | fileio.OpenMode.CREATE);
        await fileio.write(file.fd, packedData);
        await fileio.close(file.fd);
        
        console.log("图片压缩并保存成功");
    } catch (error) {
        console.error("图片压缩并保存失败", error);
    }
}

// 使用示例
const imageUri = "file:///path/to/your/image.jpg";
const outputPath = "/path/to/save/compressed_image.jpg";
const quality = 80; // 压缩质量,范围0-100

compressAndSaveImage(imageUri, outputPath, quality);

该代码通过ImageSource加载图片,使用ImagePacker进行压缩,并将压缩后的图片保存到指定路径。

在HarmonyOS鸿蒙Next中,可以使用ImageImagePacker类对图片进行压缩和保存。以下是一个简单的代码示例:

// 导入相关类
import ohos.media.image.Image;
import ohos.media.image.ImagePacker;
import ohos.media.image.ImageSource;
import ohos.media.image.PixelMap;

// 从相册或拍照获取的图片路径
String imagePath = "path/to/your/image.jpg";

// 创建ImageSource对象
ImageSource imageSource = ImageSource.create(imagePath, null);

// 解码图片为PixelMap
PixelMap pixelMap = imageSource.createPixelmap(null);

// 创建ImagePacker对象
ImagePacker imagePacker = ImagePacker.create();

// 设置压缩格式为JPEG,质量为80%
ImagePacker.PackingOptions packingOptions = new ImagePacker.PackingOptions();
packingOptions.format = "image/jpeg";
packingOptions.quality = 80;

// 压缩并保存图片
String outputPath = "path/to/save/compressed_image.jpg";
imagePacker.initializePacking(outputPath, packingOptions);
imagePacker.addImage(pixelMap);
imagePacker.finalizePacking();

此代码将图片压缩为JPEG格式,并将压缩后的图片保存到指定路径。

回到顶部