Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

徐勤民 5 месяцев назад
Родитель
Сommit
371eecc317

+ 77 - 0
src/main/ets/utils/FileHelper.ets

@@ -3,6 +3,12 @@ import fs, { ListFileOptions, ReadOptions, ReadTextOptions, WriteOptions } from
 import { BusinessError } from '@kit.BasicServicesKit';
 import { StrHelper } from './StrHelper';
 import { hilog } from '@kit.PerformanceAnalysisKit';
+import { image } from '@kit.ImageKit';
+import { buffer } from '@kit.ArkTS';
+import { LogHelper } from './LogHelper';
+import { ToolsHelper } from './ToolsHelper';
+import { photoAccessHelper } from '@kit.MediaLibraryKit';
+import { GlobalContext } from '../ContextConfig';
 
 export class FileHelper {
   private constructor() {
@@ -308,6 +314,77 @@ export class FileHelper {
     return fs.accessSync(path);
   }
 
+  static getFileFd(uri: string) {
+    let file = FileHelper.openSync(uri, fs.OpenMode.READ_ONLY)
+    return file.fd
+  }
+
+  /**
+   * 图片转base64
+   * @param photoUri
+   * @returns
+   */
+  static BmpToBase64(photoUri: string): Promise<string> {
+    const imagePackerApi: image.ImagePacker = image.createImagePacker();
+    const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
+
+    return new Promise<string>((resolve, reject) => {
+      let file = FileHelper.openSync(photoUri, fs.OpenMode.READ_ONLY)
+      const imageSource = image.createImageSource(file.fd);
+      LogHelper.error('file.fd:' + file.fd)
+
+      imageSource.createPixelMap().then((pixelMap) => {
+        imagePackerApi.packing(pixelMap, packOpts).then((data: ArrayBuffer) => {
+          let buf: buffer.Buffer = buffer.from(data);
+          LogHelper.error('data:' + data)
+          resolve(buf.toString('base64'))
+        }).catch((err: BusinessError) => {
+          LogHelper.error('packing failed with err: ' + JSON.stringify(err));
+          reject(err)
+        })
+      }).catch((err: BusinessError) => {
+        LogHelper.error('createPixelMap failed with err: ' + JSON.stringify(err));
+        reject(err)
+      });
+    })
+  }
+
+  /**
+   * 保存图片到相册,需要注意权限
+   * @param pixmap
+   */
+  static saveImage(pixmap: image.PixelMap): Promise<string> {
+    return new Promise<string>(async (resolve, reject) => {
+
+      let imageBuffer: ArrayBuffer = new ArrayBuffer(1);
+      try {
+        imageBuffer = await image.createImagePacker().packing(pixmap, { format: "image/png", quality: 100 });
+      } catch (err) {
+        ToolsHelper.showMessage('保存失败');
+        console.error(`Invoke packingPixelMap2Jpg failed, err: ${JSON.stringify(err)}`);
+        reject()
+        return;
+      }
+
+      const uri = await photoAccessHelper.getPhotoAccessHelper(GlobalContext.getContext())
+        .createAsset(photoAccessHelper.PhotoType.IMAGE, 'png');
+
+      fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
+        .then(async (file) => {
+          try {
+            await fs.write(file.fd, imageBuffer);
+            ToolsHelper.showMessage('保存成功');
+          } finally {
+            await fs.close(file.fd); // 确保文件关闭
+          }
+          resolve(uri);
+        }).catch(() => {
+        ToolsHelper.showMessage('保存失败');
+        reject()
+        return;
+      });
+    });
+  }
 
   /**
    * 打开文件,支持使用URI打开文件。使用Promise异步回调。

+ 2 - 0
src/main/ets/utils/PickerHelper.ets

@@ -4,6 +4,7 @@ import { common } from '@kit.AbilityKit';
 import { BusinessError } from '@kit.BasicServicesKit';
 import { hilog } from '@kit.PerformanceAnalysisKit';
 import { photoAccessHelper } from '@kit.MediaLibraryKit';
+import { LogHelper } from './LogHelper';
 
 
 const DOCUMENT_DEFAULT_SELECT_NUMBER: number = 9; //数量
@@ -65,6 +66,7 @@ export class PickerHelper {
       let photoPicker = new photoAccessHelper.PhotoViewPicker();
 
       let photoSelectResult: photoAccessHelper.PhotoSelectResult = await photoPicker.select(options);
+      LogHelper.error(JSON.stringify(photoSelectResult))
       if (photoSelectResult && photoSelectResult.photoUris && photoSelectResult.photoUris.length > 0) {
         return photoSelectResult.photoUris;
       } else {

+ 2 - 2
src/main/ets/view/SafeView.ets

@@ -39,7 +39,7 @@ export struct SafeView {
    */
   @Prop showBadgeRight: boolean;
   // 设置返回按钮事件,如果hideBack为true,该事件无效
-  onBackEvent?: () => void = undefined
+  onBackEvent?: () => void
   // 设置返回按钮事件
   @Prop onClickLeft?: TitleBarBtn
   @Prop onClickRight?: TitleBarBtn
@@ -57,7 +57,7 @@ export struct SafeView {
           this.customBuilderParam()
         }
         .padding({
-          top: this.isImmersive ? 0 : WindowHelper.topRectHeight + 44,
+          top: this.isImmersive ? 0 : this.hideNavBar ? 44 : WindowHelper.topRectHeight + 44,
           bottom: this.isImmersive ? 0 : WindowHelper.bottomRectHeight
         })
         .align(Alignment.Top)