From f80dd101d011866612dda1f426e4d8b368881876 Mon Sep 17 00:00:00 2001 From: tsm Date: Fri, 27 Sep 2024 14:34:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4typevalue=20=E7=9A=84null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tsm --- entry/src/main/ets/pages/DownSamplePage.ets | 25 ++- library/src/main/ets/ImageKnifeLoader.ets | 163 ++++++++++-------- .../src/main/ets/downsampling/Downsampler.ets | 2 +- 3 files changed, 103 insertions(+), 87 deletions(-) diff --git a/entry/src/main/ets/pages/DownSamplePage.ets b/entry/src/main/ets/pages/DownSamplePage.ets index c7442e0..9355a40 100644 --- a/entry/src/main/ets/pages/DownSamplePage.ets +++ b/entry/src/main/ets/pages/DownSamplePage.ets @@ -13,7 +13,7 @@ * limitations under the License. */ import { DownsampleStrategy, ImageKnifeOption, } from '@ohos/imageknife'; -import { ImageKnifeComponent, BlurTransformation, } from '@ohos/libraryimageknife'; +import { ImageKnifeComponent } from '@ohos/libraryimageknife'; import { image } from '@kit.ImageKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { Downsampler } from '@ohos/imageknife/src/main/ets/downsampling/Downsampler'; @@ -22,7 +22,7 @@ import { FileTypeUtil } from '@ohos/imageknife/src/main/ets/utils/FileTypeUtil'; @Entry @ComponentV2 struct DownSamplePage { - @Local imageKnifeOption: ImageKnifeOption = new ImageKnifeOption( { + @Local imageKnifeOption: ImageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.startIcon'), placeholderSrc: $r("app.media.loading"), errorholderSrc: $r("app.media.app_icon"), @@ -44,7 +44,7 @@ struct DownSamplePage { updateImageKnifeOption(value: string) { if (value === 'NONE') { - this.imageKnifeOption =new ImageKnifeOption( { + this.imageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.pngSample'), placeholderSrc: $r("app.media.loading"), errorholderSrc: $r("app.media.app_icon"), @@ -54,7 +54,7 @@ struct DownSamplePage { this.originalPixMap($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample')) } else if (value === 'AT_MOST') { - this.imageKnifeOption =new ImageKnifeOption( { + this.imageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.pngSample'), placeholderSrc: $r("app.media.loading"), errorholderSrc: $r("app.media.app_icon"), @@ -64,7 +64,7 @@ struct DownSamplePage { this.originalPixMap($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample')) } else if (value === 'FIT_CENTER_MEMORY') { - this.imageKnifeOption =new ImageKnifeOption( { + this.imageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.pngSample'), placeholderSrc: $r("app.media.loading"), errorholderSrc: $r("app.media.app_icon"), @@ -73,9 +73,8 @@ struct DownSamplePage { }) this.originalPixMap($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample')) - } - else if (value ==='FIT_CENTER_QUALITY') { - this.imageKnifeOption =new ImageKnifeOption( { + } else if (value === 'FIT_CENTER_QUALITY') { + this.imageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.pngSample'), placeholderSrc: $r("app.media.loading"), errorholderSrc: $r("app.media.app_icon"), @@ -84,8 +83,7 @@ struct DownSamplePage { }) this.originalPixMap($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample')) - } - else if (value === 'CENTER_INSIDE_MEMORY') { + } else if (value === 'CENTER_INSIDE_MEMORY') { this.imageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.pngSample'), placeholderSrc: $r("app.media.loading"), @@ -95,7 +93,7 @@ struct DownSamplePage { }) this.originalPixMap($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample')) - } else if (value === 'CENTER_INSIDE_QUALITY') { + } else if (value === 'CENTER_INSIDE_QUALITY') { this.imageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.pngSample'), placeholderSrc: $r("app.media.loading"), @@ -105,8 +103,7 @@ struct DownSamplePage { }) this.originalPixMap($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample')) - } - else { + } else { this.imageKnifeOption = new ImageKnifeOption({ loadSrc: $r('app.media.pngSample'), placeholderSrc: $r("app.media.loading"), @@ -123,7 +120,7 @@ struct DownSamplePage { let img: Uint8Array = await getContext(this).resourceManager.getMediaContent(imgs); let imageSource: image.ImageSource = image.createImageSource(img.buffer.slice(0)); let fileTypeUtil = new FileTypeUtil(); - let typeValue = fileTypeUtil.getFileType(img.buffer.slice(0)); + let typeValue = fileTypeUtil.getFileType(img.buffer.slice(0)) as string; let decodingOptions: image.DecodingOptions = { editable: true, desiredPixelFormat: 3, diff --git a/library/src/main/ets/ImageKnifeLoader.ets b/library/src/main/ets/ImageKnifeLoader.ets index d1135ed..0864b3c 100644 --- a/library/src/main/ets/ImageKnifeLoader.ets +++ b/library/src/main/ets/ImageKnifeLoader.ets @@ -15,7 +15,9 @@ import { CacheStrategy, ImageKnifeRequestSource, - ImageKnifeRequestWithSource, RequestJobRequest } from './model/ImageKnifeData'; + ImageKnifeRequestWithSource, + RequestJobRequest +} from './model/ImageKnifeData'; import List from '@ohos.util.List' import { FileCache } from './cache/FileCache'; import { LogUtil } from './utils/LogUtil'; @@ -42,20 +44,20 @@ class RequestData { export class ImageKnifeLoader { static async parseImage(resBuf: ArrayBuffer, typeValue: string, fileKey: string, request: RequestJobRequest): Promise { - if(request.isAnimator) { - return ImageKnifeLoader.parseForAnimatorComponent(resBuf ,typeValue ,fileKey, request) + if (request.isAnimator) { + return ImageKnifeLoader.parseForAnimatorComponent(resBuf, typeValue, fileKey, request) } if (typeValue === 'gif' || typeValue === 'webp') { - return ImageKnifeLoader.parseAnimatorImage(resBuf ,typeValue ,fileKey , request) - } else if(typeValue == "svg") { - return ImageKnifeLoader.parseSvgImage(resBuf ,typeValue ,fileKey , request) + return ImageKnifeLoader.parseAnimatorImage(resBuf, typeValue, fileKey, request) + } else if (typeValue == "svg") { + return ImageKnifeLoader.parseSvgImage(resBuf, typeValue, fileKey, request) } return ImageKnifeLoader.parseNormalImage(resBuf, typeValue, fileKey, request) } - static makeEmptyResult(error: string): RequestJobResult{ + static makeEmptyResult(error: string): RequestJobResult { return { pixelMap: undefined, bufferSize: 0, @@ -64,23 +66,25 @@ export class ImageKnifeLoader { } } - static async parseNormalImage(resBuf: ArrayBuffer, typeValue: string, fileKey: string, request: RequestJobRequest):Promise { + static async parseNormalImage(resBuf: ArrayBuffer, typeValue: string, fileKey: string, + request: RequestJobRequest): Promise { let resPixelmap: PixelMap | undefined = undefined let decodingOptions: image.DecodingOptions = { - editable: request.requestSource === ImageKnifeRequestSource.SRC && request.transformation !== undefined ? true : false, + editable: request.requestSource === ImageKnifeRequestSource.SRC && request.transformation !== undefined ? true : + false, } let imageSource: image.ImageSource = image.createImageSource(resBuf) - if (imageSource === undefined){ + if (imageSource === undefined) { return ImageKnifeLoader.makeEmptyResult("image.createImageSource failed") } let size = (await imageSource.getImageInfo()).size - try{ + try { if ((request.downsampType !== DownsampleStrategy.NONE) && - request.requestSource == ImageKnifeRequestSource.SRC ) { - decodingOptions =await ImageKnifeLoader.downsamplerReqSize(typeValue,request,size,ImageKnifeRequestSource.SRC) + request.requestSource == ImageKnifeRequestSource.SRC) { + decodingOptions = ImageKnifeLoader.downsamplerReqSize(typeValue, request, size, ImageKnifeRequestSource.SRC) } - }catch(err){ + } catch (err) { return ImageKnifeLoader.makeEmptyResult("image.createImageSource failed") } @@ -97,15 +101,16 @@ export class ImageKnifeLoader { pixelMap: resPixelmap, bufferSize: resBuf.byteLength, fileKey: fileKey, - size:size, - type:typeValue + size: size, + type: typeValue }; } + static async parseSvgImage(resBuf: ArrayBuffer, typeValue: string, fileKey: string, - request: RequestJobRequest): Promise { + request: RequestJobRequest): Promise { let resPixelmap: PixelMap | undefined = undefined let imageSource: image.ImageSource = image.createImageSource(resBuf) - if (imageSource === undefined){ + if (imageSource === undefined) { return ImageKnifeLoader.makeEmptyResult("image.createImageSource failed") } @@ -121,12 +126,12 @@ export class ImageKnifeLoader { editable: true, desiredSize: defaultSize }; - try{ + try { if ((request.downsampType !== DownsampleStrategy.NONE) && - request.requestSource == ImageKnifeRequestSource.SRC ) { - opts =await ImageKnifeLoader.downsamplerReqSize(typeValue,request,size) + request.requestSource == ImageKnifeRequestSource.SRC) { + opts = ImageKnifeLoader.downsamplerReqSize(typeValue, request, size) } - }catch(err){ + } catch (err) { return ImageKnifeLoader.makeEmptyResult("image.createImageSource failed") } await imageSource.createPixelMap(opts) @@ -142,13 +147,14 @@ export class ImageKnifeLoader { pixelMap: resPixelmap, bufferSize: resBuf.byteLength, fileKey: fileKey, - type:typeValue + type: typeValue }; } + static async parseAnimatorImage(resBuf: ArrayBuffer, typeValue: string, - fileKey: string,request: RequestJobRequest): Promise { + fileKey: string, request: RequestJobRequest): Promise { let imageSource: image.ImageSource = image.createImageSource(resBuf) - if (imageSource === undefined){ + if (imageSource === undefined) { return ImageKnifeLoader.makeEmptyResult("image.createImageSource failed") } @@ -156,28 +162,32 @@ export class ImageKnifeLoader { let size = (await imageSource.getImageInfo()).size imageSource.release() - if(frameCount == undefined || frameCount == 1) { + if (frameCount == undefined || frameCount == 1) { } else { - let base64str = "data:image/" + typeValue + ";base64," + new util.Base64Helper().encodeToStringSync(new Uint8Array(resBuf)) + let base64str = + "data:image/" + typeValue + ";base64," + new util.Base64Helper().encodeToStringSync(new Uint8Array(resBuf)) return { pixelMap: base64str, bufferSize: resBuf.byteLength, fileKey: fileKey, - size:size, - type:typeValue + size: size, + type: typeValue }; } return ImageKnifeLoader.parseNormalImage(resBuf, typeValue, fileKey, request) } + // 为AnimatorComponent解析动图 - static async parseForAnimatorComponent(resBuf: ArrayBuffer, typeValue: string, fileKey: string,request: RequestJobRequest): Promise { + static async parseForAnimatorComponent(resBuf: ArrayBuffer, typeValue: string, fileKey: string, + request: RequestJobRequest): Promise { if (typeValue === 'gif' || typeValue === 'webp') { let imageSource: image.ImageSource = image.createImageSource(resBuf); - if (imageSource === undefined){ + if (imageSource === undefined) { return ImageKnifeLoader.makeEmptyResult("image.createImageSource failed") } let decodingOptions: image.DecodingOptions = { - editable: request.requestSource === ImageKnifeRequestSource.SRC && request.transformation !== undefined ? true : false, + editable: request.requestSource === ImageKnifeRequestSource.SRC && request.transformation !== undefined ? true : + false, } let pixelMapList: Array = [] let delayList: Array = [] @@ -214,13 +224,15 @@ export class ImageKnifeLoader { } // 获取图片资源 - static async getImageArrayBuffer(request: RequestJobRequest, requestList: List | undefined,fileKey:string): Promise { + static async getImageArrayBuffer(request: RequestJobRequest, + requestList: List | undefined, fileKey: string): Promise { let resBuf: ArrayBuffer | undefined // 判断自定义下载 - if (request.customGetImage !== undefined && request.requestSource == ImageKnifeRequestSource.SRC && typeof request.src == "string") { + if (request.customGetImage !== undefined && request.requestSource == ImageKnifeRequestSource.SRC && + typeof request.src == "string") { // 先从文件缓存获取 - resBuf = FileCache.getFileCacheByFile(request.context, fileKey , request.fileCacheFolder) + resBuf = FileCache.getFileCacheByFile(request.context, fileKey, request.fileCacheFolder) if (resBuf === undefined) { LogUtil.log("start customGetImage src=" + request.src) try { @@ -239,16 +251,14 @@ export class ImageKnifeLoader { LogUtil.log("ImageKnife_DataTime_requestJob_saveFileCacheOnlyFile.end:" + request.src) } } - } - else { + } else { if (typeof request.src === 'string') { if (request.src.indexOf("http://") == 0 || request.src.indexOf("https://") == 0) { //从网络下载 // 先从文件缓存获取 - resBuf = FileCache.getFileCacheByFile(request.context, fileKey , request.fileCacheFolder) - if (resBuf !== undefined){ + resBuf = FileCache.getFileCacheByFile(request.context, fileKey, request.fileCacheFolder) + if (resBuf !== undefined) { LogUtil.log("success get image from filecache for key = " + fileKey + " src = " + request.src) - } - else if (request.onlyRetrieveFromCache != true) { + } else if (request.onlyRetrieveFromCache != true) { LogUtil.log("HttpDownloadClient.start:" + request.src) let httpRequest = http.createHttp(); let progress: number = 0 @@ -277,10 +287,11 @@ export class ImageKnifeLoader { if (requestList === undefined) { // 子线程 emitter.emit(Constants.PROGRESS_EMITTER + request.memoryKey, { data: { "value": progress } }) - }else { + } else { // 主线程请求 requestList!.forEach((requestWithSource: ImageKnifeRequestWithSource) => { - if (requestWithSource.request.imageKnifeOption.progressListener !== undefined && requestWithSource.source === ImageKnifeRequestSource.SRC) { + if (requestWithSource.request.imageKnifeOption.progressListener !== undefined && + requestWithSource.source === ImageKnifeRequestSource.SRC) { requestWithSource.request.imageKnifeOption.progressListener(progress) } }) @@ -311,29 +322,31 @@ export class ImageKnifeLoader { LogUtil.log("HttpDownloadClient.end:" + request.src) // 保存文件缓存 if (resBuf !== undefined && request.writeCacheStrategy !== CacheStrategy.Memory) { - LogUtil.log("ImageKnife_DataTime_requestJob_saveFileCacheOnlyFile.start:"+request.src) - FileCache.saveFileCacheOnlyFile(request.context, fileKey, resBuf , request.fileCacheFolder) - LogUtil.log("ImageKnife_DataTime_requestJob_saveFileCacheOnlyFile.end:"+request.src) + LogUtil.log("ImageKnife_DataTime_requestJob_saveFileCacheOnlyFile.start:" + request.src) + FileCache.saveFileCacheOnlyFile(request.context, fileKey, resBuf, request.fileCacheFolder) + LogUtil.log("ImageKnife_DataTime_requestJob_saveFileCacheOnlyFile.end:" + request.src) } - } - else { + } else { throw new Error('onlyRetrieveFromCache,do not fetch image src = ' + request.src) } } else if (request.src.startsWith('datashare://') || request.src.startsWith('file://')) { await fs.open(request.src, fs.OpenMode.READ_ONLY).then(async (file) => { - await fs.stat(file.fd).then(async (stat) =>{ + await fs.stat(file.fd).then(async (stat) => { let buf = new ArrayBuffer(stat.size); await fs.read(file.fd, buf).then((readLen) => { resBuf = buf; fs.closeSync(file.fd); - }).catch((err:BusinessError) => { - throw new Error('LoadDataShareFileClient fs.read err happened uri=' + request.src + " err.msg=" + err?.message + " err.code=" + err?.code) + }).catch((err: BusinessError) => { + throw new Error('LoadDataShareFileClient fs.read err happened uri=' + request.src + " err.msg=" + + err?.message + " err.code=" + err?.code) }) - }).catch((err:BusinessError) => { - throw new Error('LoadDataShareFileClient fs.stat err happened uri=' + request.src + " err.msg=" + err?.message + " err.code=" + err?.code) + }).catch((err: BusinessError) => { + throw new Error('LoadDataShareFileClient fs.stat err happened uri=' + request.src + " err.msg=" + + err?.message + " err.code=" + err?.code) }) - }).catch((err:BusinessError) => { - throw new Error('LoadDataShareFileClient fs.open err happened uri=' + request.src + " err.msg=" + err?.message + " err.code=" + err?.code) + }).catch((err: BusinessError) => { + throw new Error('LoadDataShareFileClient fs.open err happened uri=' + request.src + " err.msg=" + + err?.message + " err.code=" + err?.code) }) } else { //从本地文件获取 try { @@ -350,15 +363,16 @@ export class ImageKnifeLoader { } } else if (typeof request.src == "number") { //从资源文件获取 let manager = request.context.createModuleContext(request.moduleName).resourceManager - if (resBuf == undefined && request.onlyRetrieveFromCache != true && request.requestSource == ImageKnifeRequestSource.SRC) { - if(request.src == -1) { + if (resBuf == undefined && request.onlyRetrieveFromCache != true && + request.requestSource == ImageKnifeRequestSource.SRC) { + if (request.src == -1) { let resName = request.resName as string resBuf = (await manager.getMediaByName(resName.substring(10))).buffer as ArrayBuffer } else { resBuf = manager.getMediaContentSync(request.src).buffer as ArrayBuffer } } else if (resBuf == undefined && request.requestSource != ImageKnifeRequestSource.SRC) { - if(request.src == -1) { + if (request.src == -1) { let resName = request.resName as string resBuf = (await manager.getMediaByName(resName.substring(10))).buffer as ArrayBuffer } else { @@ -368,30 +382,35 @@ export class ImageKnifeLoader { } } - if (resBuf === undefined){ + if (resBuf === undefined) { throw new Error('getImageArrayBuffer undefined') } return resBuf } - static async downsamplerReqSize(typeValue:string,request:RequestJobRequest ,size:Size,SRC?:ImageKnifeRequestSource): Promise{ - let reqSize = new Downsampler().calculateScaling(typeValue, size.width, size.height, request.targetWidth, request.targetHeight, request.downsampType) - if(typeValue=="svg") { + + static downsamplerReqSize(typeValue: string, request: RequestJobRequest, size: Size, + SRC?: ImageKnifeRequestSource) { + let reqSize = + new Downsampler().calculateScaling(typeValue, size.width, size.height, request.targetWidth, request.targetHeight, + request.downsampType) + if (typeValue == "svg") { return ({ editable: true, desiredSize: ({ height: vp2px(reqSize.targetHeight), width: vp2px(reqSize.targetWidth) } as Size) - } as image.DecodingOptions ) - }else { - return( { - editable: request.requestSource ===SRC && request.transformation !== undefined ? true : false, - desiredSize: ({ - width: reqSize.targetWidth, - height: reqSize.targetHeight - }as Size) - }as image.DecodingOptions) - } + + } as image.DecodingOptions) + } else { + return ({ + editable: request.requestSource === SRC && request.transformation !== undefined ? true : false, + desiredSize: ({ + width: reqSize.targetWidth, + height: reqSize.targetHeight + } as Size) + } as image.DecodingOptions) + } } } diff --git a/library/src/main/ets/downsampling/Downsampler.ets b/library/src/main/ets/downsampling/Downsampler.ets index 517fc34..a1bb180 100644 --- a/library/src/main/ets/downsampling/Downsampler.ets +++ b/library/src/main/ets/downsampling/Downsampler.ets @@ -30,7 +30,7 @@ export interface calculateScaleType { export class Downsampler { calculateScaling( - typeValue: string |null, + typeValue: string, sourceWidth: number, //原始宽高 sourceHeight: number, //原始宽高 requestWidth: number, //请求宽高