diff --git a/src/main/ets/utils/FileHelper.ets b/src/main/ets/utils/FileHelper.ets index c2bd0b3..7254824 100644 --- a/src/main/ets/utils/FileHelper.ets +++ b/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 { + const imagePackerApi: image.ImagePacker = image.createImagePacker(); + const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 }; + + return new Promise((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 { + return new Promise(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异步回调。 diff --git a/src/main/ets/utils/PickerHelper.ets b/src/main/ets/utils/PickerHelper.ets index 992521c..e2cabcd 100644 --- a/src/main/ets/utils/PickerHelper.ets +++ b/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 { diff --git a/src/main/ets/view/SafeView.ets b/src/main/ets/view/SafeView.ets index f1d2e78..519f0d3 100644 --- a/src/main/ets/view/SafeView.ets +++ b/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)