From c11d61a577ada2ced6a97cb70fd1badff3e8f826 Mon Sep 17 00:00:00 2001 From: 24186 <2418639820@qq.com> Date: Thu, 1 Feb 2024 00:17:10 +0800 Subject: [PATCH 1/5] =?UTF-8?q?work=E6=9B=B4=E6=94=B9=E4=B8=BAyaskpool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/ets/pages/pngjTestCasePage.ets | 12 +- .../ets/components/imageknife/pngj/Png.ets | 200 ++++++++++++++++++ .../ets/components/imageknife/pngj/Pngj.ts | 69 ++++-- 3 files changed, 253 insertions(+), 28 deletions(-) create mode 100644 library/src/main/ets/components/imageknife/pngj/Png.ets diff --git a/entry/src/main/ets/pages/pngjTestCasePage.ets b/entry/src/main/ets/pages/pngjTestCasePage.ets index a7ff0e1..19680cf 100644 --- a/entry/src/main/ets/pages/pngjTestCasePage.ets +++ b/entry/src/main/ets/pages/pngjTestCasePage.ets @@ -115,18 +115,18 @@ struct PngjTestCasePage { if (!this.pngdecodeRun2) { this.pngdecodeRun2 = true; let pngj = new Pngj(); - let png_worker = new worker.ThreadWorker('entry/ets/workers/upngWorkerTestCase.ets', { - type: 'classic', - name: 'readPngImageAsync' - }) - pngj.readPngImageAsync(png_worker, this.pngSource2!, {pngCallback: (sender:ArrayBuffer, value:Record) => { + // let png_worker = new worker.ThreadWorker('entry/ets/workers/upngWorkerTestCase.ets', ) + let obj ={ + type: 'classic', + name: 'readPngImageAsync' + } + pngj.readPngImageAsync(obj, this.pngSource2!, {pngCallback: (sender:ArrayBuffer, value:Record) => { this.pngSource2 = sender this.hint8 = '重新获取buffer才能测试' this.hint2 = 'img with=' + value.width + ' img height=' + value.height + ' img depth=' + value.depth + ' img ctype=' + value.ctype this.pngdecodeRun2 = false; }}) - } else { this.hint8 = '已经在执行了,请稍等' } diff --git a/library/src/main/ets/components/imageknife/pngj/Png.ets b/library/src/main/ets/components/imageknife/pngj/Png.ets new file mode 100644 index 0000000..02bec03 --- /dev/null +++ b/library/src/main/ets/components/imageknife/pngj/Png.ets @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {UPNG} from '../../3rd_party/upng/UPNG'; +import {PngCallback} from './PngCallback'; +import image from '@ohos.multimedia.image'; +import resourceManager from '@ohos.resourceManager'; +import ArkWorker from '@ohos.worker' +import { BusinessError } from '@ohos.base' +export class Pngj { + readPngImageInfo(arraybuffer: ArrayBuffer, callback:PngCallback) { + let imageSource:image.ImageSource = image.createImageSource(arraybuffer); + if (imageSource != undefined){ + imageSource.getImageInfo((err:BusinessError, value:image.ImageInfo) => { + if (err) { + return; + } + callback.pngCallback(arraybuffer, value); + }); + } + + } + readPngImage(pngBuffer: ArrayBuffer, callback:PngCallback) { + var png = UPNG.decode(pngBuffer); + callback.pngCallback(pngBuffer, png) + } + + writePngWithString(addInfo:string, pngBuffer: ArrayBuffer,callback:PngCallback) { + var pngDecode = UPNG.decode(pngBuffer); + var newPng = UPNG.encodeWithString(addInfo, UPNG.toRGBA8(pngDecode), pngDecode.width, pngDecode.height, 0) + callback.pngCallback(pngBuffer, newPng); + } + + writePng(pngBuffer: ArrayBuffer,callback:PngCallback) { + var pngDecode = UPNG.decode(pngBuffer); + var newPng = UPNG.encode(UPNG.toRGBA8(pngDecode), pngDecode.width, pngDecode.height, 0) + callback.pngCallback(pngBuffer, newPng); + } + + readPngImageAsync(type: any, pngBuffer: ArrayBuffer, callback: PngCallback) { + // worker.onerror = function (data) { + // + // } + // + // worker.onmessageerror = function (e) { + // + // } + // + // worker.onexit = function () { + // + // } + // + // worker.onmessage = function(e) { + // var data = e.data; + // switch (data.type) { + // case 'readPngImageAsync': + // callback.pngCallback(data.receiver, data.data) + // break; + // default: + // break + // } + // worker.terminate(); + // } + // var obj = { type: 'readPngImageAsync', data: pngBuffer } + // worker.postMessage(obj, [pngBuffer]) + let task = new taskpool.Task(taskParseImage,type, arrayBuffer, callback) + // task.setTransferList([]) + taskpool.execute(task).then((pixelmap: Object) => { + LogUtil.log('ceshi321 : Succeeded in creating pixelmap Ui .' + (pixelmap as image.PixelMap).getPixelBytesNumber()) + onCompleteFunction(pixelmap as image.PixelMap); + }).catch((err: string) => { + LogUtil.log("ceshi321 : test occur error: " + err) + onErrorFunction(err); + }); + + + + } + // taskPoolExecutePixelMap(arrayBuffer: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void) { + // let task = new taskpool.Task(taskParseImage, arrayBuffer, scale) + // task.setTransferList([]) + // taskpool.execute(task).then((pixelmap: Object) => { + // + // }).catch((err: string) => { + // LogUtil.log("ceshi321 : " + err) + // }); + // } + + + + + + + + + + + + + + writePngWithStringAsync(worker: any, addInfo: string, pngBuffer: ArrayBuffer, callback: PngCallback) { + worker.onerror = function (data) { + + } + + worker.onmessageerror = function (e) { + + } + + worker.onexit = function () { + + } + + worker.onmessage = function(e) { + var data = e.data; + switch (data.type) { + case 'writePngWithStringAsync': + callback.pngCallback(data.receiver, data.data) + break; + default: + break + } + worker.terminate(); + } + + var obj = { type: 'writePngWithStringAsync', data:pngBuffer, info: addInfo} + worker.postMessage(obj, [pngBuffer]) + + } + + writePngAsync(worker: any, pngBuffer: ArrayBuffer, callback: PngCallback) { + worker.onerror = function (data) { + + } + + worker.onmessageerror = function (e) { + + } + + worker.onexit = function () { + + } + + worker.onmessage = function(e) { + var data = e.data; + switch (data.type) { + case 'writePngAsync': + callback.pngCallback(data.receiver, data.data) + break; + default: + break + } + worker.terminate(); + } + + var obj = { type: 'writePngAsync', data:pngBuffer} + worker.postMessage(obj, [pngBuffer]) + + } + +} +@Concurrent +async function taskParseImage(type, arrayBuffer, callback): Promise { + + switch (type.type) { + case 'readPngImageAsync': + callback(data.receiver, data.data) + break; + default: + break + } + + let obj = { type: 'readPngImageAsync', data: arrayBuffer } + + return (obj,[arrayBuffer]) +} + +// function taskPoolExecutePixelMap(arrayBuffer: ArrayBuffer, scale: number, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void) { +// LogUtil.log("ceshi321 : arrayBuffer长度" + arrayBuffer.byteLength) +// let task = new taskpool.Task(taskParseImage, arrayBuffer, scale) +// task.setTransferList([]) +// taskpool.execute(task).then((pixelmap: Object) => { +// LogUtil.log('ceshi321 : Succeeded in creating pixelmap Ui .' + (pixelmap as image.PixelMap).getPixelBytesNumber()) +// onCompleteFunction(pixelmap as image.PixelMap); +// }).catch((err: string) => { +// LogUtil.log("ceshi321 : test occur error: " + err) +// onErrorFunction(err); +// }); +// } diff --git a/library/src/main/ets/components/imageknife/pngj/Pngj.ts b/library/src/main/ets/components/imageknife/pngj/Pngj.ts index fb94dfe..a0a3153 100644 --- a/library/src/main/ets/components/imageknife/pngj/Pngj.ts +++ b/library/src/main/ets/components/imageknife/pngj/Pngj.ts @@ -63,33 +63,58 @@ export class Pngj { } readPngImageAsync(worker: any, pngBuffer: ArrayBuffer, callback: PngCallback) { - worker.onerror = function (data) { + // worker.onerror = function (data) { + // + // } + // + // worker.onmessageerror = function (e) { + // + // } + // + // worker.onexit = function () { + // + // } + // + // worker.onmessage = function(e) { + // var data = e.data; + // switch (data.type) { + // case 'readPngImageAsync': + // callback.pngCallback(data.receiver, data.data) + // break; + // default: + // break + // } + // worker.terminate(); + // } + // var obj = { type: 'readPngImageAsync', data: pngBuffer } + // worker.postMessage(obj, [pngBuffer]) + let task = new taskpool.Task(taskParseImage, arrayBuffer, scale) + task.setTransferList([]) + taskpool.execute(task).then((pixelmap: Object) => { + LogUtil.log('ceshi321 : Succeeded in creating pixelmap Ui .' + (pixelmap as image.PixelMap).getPixelBytesNumber()) + onCompleteFunction(pixelmap as image.PixelMap); + }).catch((err: string) => { + LogUtil.log("ceshi321 : test occur error: " + err) + onErrorFunction(err); + }); - } - worker.onmessageerror = function (e) { - } - - worker.onexit = function () { - - } - - worker.onmessage = function(e) { - var data = e.data; - switch (data.type) { - case 'readPngImageAsync': - callback.pngCallback(data.receiver, data.data) - break; - default: - break - } - worker.terminate(); - } - var obj = { type: 'readPngImageAsync', data: pngBuffer } - worker.postMessage(obj, [pngBuffer]) } + + + + + + + + + + + + + writePngWithStringAsync(worker: any, addInfo: string, pngBuffer: ArrayBuffer, callback: PngCallback) { worker.onerror = function (data) { From 0ba58f2b1fe5ba9fa9577620a795ce429a7aa311 Mon Sep 17 00:00:00 2001 From: sijainguo Date: Fri, 26 Apr 2024 17:51:37 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=B8=8B=E9=87=87=E6=A0=B7=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=96=87=E4=BB=B6=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ets/components/imageknife/Downsampling/BaseDownsampling.ets | 2 ++ .../components/imageknife/Downsampling/DownsampleStartegy.ets | 2 ++ .../main/ets/components/imageknife/Downsampling/Downsampler.ets | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets create mode 100644 library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets create mode 100644 library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets diff --git a/library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets b/library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets new file mode 100644 index 0000000..317587f --- /dev/null +++ b/library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets @@ -0,0 +1,2 @@ +/* + * asdfasdfasdfasdfasdf*/ \ No newline at end of file diff --git a/library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets b/library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets new file mode 100644 index 0000000..87de8a4 --- /dev/null +++ b/library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets @@ -0,0 +1,2 @@ +/* + * dsasdafasdfasdf*/ \ No newline at end of file diff --git a/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets b/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets new file mode 100644 index 0000000..317587f --- /dev/null +++ b/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets @@ -0,0 +1,2 @@ +/* + * asdfasdfasdfasdfasdf*/ \ No newline at end of file From 15401bbc3233746bbf43493aeb99c1717582e033 Mon Sep 17 00:00:00 2001 From: 24186 <2418639820@qq.com> Date: Fri, 26 Apr 2024 21:45:57 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=B8=8B=E9=87=87=E6=A0=B7=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=AE=BD=E9=AB=98=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hvigor/hvigor-config.json5 | 4 +- .../Downsampling/BaseDownsampling.ets | 8 +- .../Downsampling/DownsampleStartegy.ets | 81 ++++++++++++++++++- .../imageknife/ImageKnifeComponent.ets | 3 + .../components/imageknife/RequestOption.ets | 7 ++ .../imageknife/interface/IParseImage.ets | 4 +- .../requestmanage/RequestManager.ets | 2 +- .../imageknife/utils/ParseImageUtil.ets | 18 +++-- 8 files changed, 114 insertions(+), 13 deletions(-) diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index 122677b..69b4a2d 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,6 +1,6 @@ { - "hvigorVersion": "3.0.9", + "hvigorVersion": "4.1.2", "dependencies": { - "@ohos/hvigor-ohos-plugin": "3.0.9" + "@ohos/hvigor-ohos-plugin": "4.1.2" } } \ No newline at end of file diff --git a/library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets b/library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets index 317587f..fa7add3 100644 --- a/library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets +++ b/library/src/main/ets/components/imageknife/Downsampling/BaseDownsampling.ets @@ -1,2 +1,6 @@ -/* - * asdfasdfasdfasdfasdf*/ \ No newline at end of file +export interface BaseDownsampling{ + getScaleFactor(sourceWidth:number, sourceHeight:number, requestWidth:number, requestHeight:number):number + + + getSampleSizeRounding(sourceWidth:number, sourceHeight:number, requestWidth:number, requestHeight:number):number +} \ No newline at end of file diff --git a/library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets b/library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets index 87de8a4..01fe132 100644 --- a/library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets +++ b/library/src/main/ets/components/imageknife/Downsampling/DownsampleStartegy.ets @@ -1,2 +1,79 @@ -/* - * dsasdafasdfasdf*/ \ No newline at end of file +import { BaseDownsampling } from './BaseDownsampling' + + +export class CenterInside{ + getScaleFactor(sourceWidth:number, sourceHeight:number,requestWidth:number, requestHeight:number):number { + + return Math.min(1,FitCenter.getScaleFactor(sourceWidth, sourceHeight, requestWidth, requestHeight)) + } + getSampleSizeRounding(sourceWidth:number, sourceHeight:number, requestWidth:number, requestHeight:number):SampleSizeRounding { + return this.getScaleFactor(sourceWidth, sourceHeight, requestWidth, requestHeight)==1 + ?SampleSizeRounding.QUALITY + :FitCenter.getSampleSizeRounding(sourceWidth, sourceHeight, requestWidth, requestHeight) + + } + +} +/*不进行下采样*/ +export class DownsampleNone implements BaseDownsampling{ + getScaleFactor(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number { + return 1 + } + + getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number { + return SampleSizeRounding.QUALITY + } + +} +/* 下采样使得图像的组大尺寸在给定的尺寸的1/2之间*/ + export class AtMost implements BaseDownsampling{ + getScaleFactor(sourceWidth: number, sourceHeight: number, requestWidth:number,requestHeight: number): number { + let maxIntegerFactor=Math.ceil(Math.max(sourceHeight/requestHeight,sourceWidth/requestWidth)); + let lesserOrEqualSampleSize = Math.max(1,highestOneBit(maxIntegerFactor)) + let greaterOrEqualSampleSize = lesserOrEqualSampleSize<<(lesserOrEqualSampleSize | undefined = undefined; @@ -502,6 +505,10 @@ export class RequestOption { this.gpuEnabled = true; return this; } + downsampleStrategy(downsampType: ESObject){ + this.downsampType = downsampType + return this; + } // 占位图解析成功 placeholderOnComplete = (imageKnifeData:ImageKnifeData) => { diff --git a/library/src/main/ets/components/imageknife/interface/IParseImage.ets b/library/src/main/ets/components/imageknife/interface/IParseImage.ets index 9713810..2b6d37c 100644 --- a/library/src/main/ets/components/imageknife/interface/IParseImage.ets +++ b/library/src/main/ets/components/imageknife/interface/IParseImage.ets @@ -13,8 +13,10 @@ * limitations under the License. */ import { BusinessError } from '@ohos.base' +import { RequestOption } from '../RequestOption'; + export interface IParseImage { - parseImage:(imageinfo:ArrayBuffer, onCompleteFunction:(value:T)=>void | PromiseLike, onErrorFunction:(reason?:BusinessError|string)=>void)=>void; + parseImage:(imageinfo:ArrayBuffer, onCompleteFunction:(value:T)=>void | PromiseLike, onErrorFunction:(reason?:BusinessError|string)=>void,request?:RequestOption)=>void; parseImageThumbnail:(scale:number, imageinfo:ArrayBuffer, onCompleteFunction:(value:T)=>void | PromiseLike, onErrorFunction:(reason?:BusinessError|string)=>void)=>void; } \ No newline at end of file diff --git a/library/src/main/ets/components/imageknife/requestmanage/RequestManager.ets b/library/src/main/ets/components/imageknife/requestmanage/RequestManager.ets index a415276..3a76ae4 100644 --- a/library/src/main/ets/components/imageknife/requestmanage/RequestManager.ets +++ b/library/src/main/ets/components/imageknife/requestmanage/RequestManager.ets @@ -188,7 +188,7 @@ export class RequestManager { let success = (value: PixelMap) => { onComplete(value); } - this.mParseImageUtil.parseImage(arrayBuffer, success, onError) + this.mParseImageUtil.parseImage(arrayBuffer, success, onError,request) } } } diff --git a/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets b/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets index fd3cb98..2788f60 100644 --- a/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets +++ b/library/src/main/ets/components/imageknife/utils/ParseImageUtil.ets @@ -16,15 +16,14 @@ import { IParseImage } from '../interface/IParseImage' import image from '@ohos.multimedia.image'; import { BusinessError } from '@ohos.base' -import taskpool from '@ohos.taskpool'; -import { LogUtil } from './LogUtil'; +import { RequestOption } from '../RequestOption'; export class ParseImageUtil implements IParseImage { - parseImage(imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void) { - this.parseImageThumbnail(1, imageinfo, onCompleteFunction, onErrorFunction) + parseImage(imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void,request?:RequestOption) { + this.parseImageThumbnail(1, imageinfo, onCompleteFunction, onErrorFunction,request) } - parseImageThumbnail(scale: number, imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void) { + parseImageThumbnail(scale: number, imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike, onErrorFunction: (reason?: BusinessError | string) => void,request?:RequestOption) { let imageSource: image.ImageSource = image.createImageSource(imageinfo); // 步骤一:文件转为pixelMap 然后变换 给Image组件 imageSource.getImageInfo().then((value) => { @@ -38,6 +37,15 @@ export class ParseImageUtil implements IParseImage { editable: true, desiredSize: defaultSize }; + const b = new Downsamper(imageinfo, hValue, wValue, requ,request) + let options: image.DecodingOptions = { + editable: true, + desiredSize: { + height: b.targetHeight, + width: b.targetWidth + } + }; + imageSource.createPixelMap(opts).then((pixelMap: image.PixelMap) => { onCompleteFunction(pixelMap); From 22f79c3588f8349d1d700528634b1076a600902e Mon Sep 17 00:00:00 2001 From: sijainguo <547537959@qq.com> Date: Fri, 26 Apr 2024 22:09:24 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=8F=90=E4=BA=A4=20Downsampler=20?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imageknife/Downsampling/Downsampler.ets | 138 +++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets b/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets index 317587f..568ab4a 100644 --- a/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets +++ b/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets @@ -1,2 +1,138 @@ /* - * asdfasdfasdfasdfasdf*/ \ No newline at end of file + * asdfasdfasdfasdfasdf*/ +import { CenterOutside, FitCenter, SampleSizeRounding } from './Downsamplestrategy'; +import { FileTypeutil } from '../../utits/Fitetypeutit'; +import { Request0ption } from '../../Requestoption'; +let TAG = 'downsampling' +export class Downsampler { + calculateScaling( + imageType: ArrayBuffer, + sourceHeight:number, + sourceWidth:number, + request?: RequestOption + ):ESObject { + const fileType: string | null = new FileTypeUtil().getFileType(imageType) + let powerOfTwoWidth: number | null = null; + let powerOfTwoHeight: number | null = null; + let targetWidth: number = 0 + let targetHeight: number = 0 + if (request?.size.width && !request?.size.height) { + targetWidth = this.round((request?.size.height) * sourceWidth / sourceHeight) + } else if (request?.size.height && !request?.size.width) { + targetHeight = this.round((request?.size.width) * sourceHeight / sourceWidth) + } else if (request?.size.height && request?.size.width) { + targetHeight = request.size.height; + targetWidth = request?.size.width; + } else { + console.log('宽高都不存在') + } + if (sourceWidth <= 0 || sourceleight <= 0) return; + let orientedSourceWidth = sourceWidth; + let orientedSourceHeight = sourceHeight; + if (this.isRotationRequired(90)) { + orientedSourceWidth = sourceHeight; + orientedSourceHeight = sourceWidth; + } + /*安卓的模式*/ + let exactScaleFactor: number = FitCenter.getScaleFactor(orientedSourceWidth, orientedSourceHeight, targetWidth, targetHeight) + if (exactScaleFactor <= 0) { + throw new Error("Cannot round with exactScaleFactor"); + console.log('exactScaleFactor', exactScaleFactor) + /*安卓的模式*/ + let rounding: SampleSizeRounding = Center0utside.getSampleSizeRounding(orientedSourceWidth, orientedSourceHeight, targetWidth, targetHeight) + if (rounding == null) { + throw new Error("Cannot round with null rounding"); + } + let outWidth: number = this.round(exactScaleFactor * orientedSourceWidth); + let outHeight: number = this.round(exactScaleFactor * orientedSourceHeight); + let widthScaleFactor = Math.floor(orientedSourceWidth / outWidth); + let heightScaleFactor = Math.floor(orientedSourceHeight / outHeight); + let scaleFactor = rounding == SampleSizeRounding.MEMORY ? Math.max(widthScaleFactor, heightScaleFactor) : Math.min(widthScaleFactor, heightScaleFactor) + let powerOfTwoSampleSize: number; + powerOfTwoSampleSize = Math.max(1, this.highestOneBit(scaleFactor)); + if (fileType == "JPEG") { + let nativeScaling = Hath.min(powerOfTwoSampleSize, 8); + powerOfTwoWidth = Math.ceil(orientedSourceWidth / nativeScaling); + powerOfTwoHeight = Math.ceil(orientedSourceHeight / nativeScaling); + let secondaryScaling = Math.floor(powerOfTwoSampleSize / 8); + if (secondaryScaling > 0) { + powerOfTwoWidth = powerOfTwoWidth / secondaryScaling; + powerOfTwoHeight = powerOfTwoHeight / secondaryScaling; + } + } else if (fileType == "PNG") { + powerOfTwoWidth = Math.floor(orientedSourceWidth / powerOfTwoSampleSize); + PowerOfTwoHeight = Math.floor(orientedSourceHeight / powerOfTwoSamplesize); + console.log('执行了没', powerOfTwoHeight, powerOfTwoWidth) + } else if (fileType == "WEBP") { + powerOfTwoWidth = Math.round(orientedSourceWidth / powerOfTwoSampleSize); + poWerOfTwoHeight = Math.round(orientedSourceHeight / powerOfTwoSampleSize); + } else if ( + orientedSourceWidth % powerOfTwoSampleSize != 0 || orientedSourceHeight % powerOfTwoSampleSize != 0) { + + + // let dimensions; number[] = this.getDimensions(imageReader, options, decodeCallbacks,bitmapPool); + // powerOfTwoWidth = dimensions[0]; + // powerofTwoHeight = dimensions[1]; + } else { + powerOfTwoWidth = orientedSourceWidth / powerOfTwoSampleSize; + powerOfTwoHeight = orientedSourceHeight / powerOfTwoSampleSize; + } + // Let adjustedScaleFactor = downsampleStrategy.getScaleFactor(powerOfTwoWidth, powerOfTwoHeight, targetWidth, targetHeight); + // Density scaling is only supported if inBitmap is null prior to KitKat. Avoid setting + // densities here so we calculate the final Bitmap size correctly. + // if (Build.VERSION,SDK_INT >=Build.VERSION_CODES.KITKAT) { + // options.inTargetDensity = this.adjustTargetDensityForError(adjustedScaleFactor); + // options,inDensity = this.getDensityMultiplier(adjustedScaleFactor); + //} + // if (this.isScaling(options)){ + // options.inScaled = true; + // }else { + // options.inDensity = options.inTargetDensity =0; + // } + //} + let a: ESObject = { "targetWidth": power0fTwoWidth, "targetHeight": powerOfTuoHeight } + return a + } + //decodeStream(imageReader:ImageReader, options: ESObject, callbacks: DecodeCallbacks, bitmapPool: ESObject) { + //if (!options.inJustDecodeBounds){ + // callbacks.onObtainBounds(); + // imageReader.stopGrowingBuffers(); + // } + // } + // getDimensions(imageReader: ImageReader, options: ESObject, decodeCallbacks: DecodeCallbacks, bitmapPool: ESObject):number[] { + // options.inJustDecodeBounds = true; + // this.decodeStream(imageReader, options, decodeCallbacks, bitmapPool); + // options.inJustDecodeBounds =false; + // return new Array(options.outWidth, options,outHeight); + // + // } + + highest0neBit(i: number): number{ + i |= (i >> 1); + i |= (i >> 2); + i |= (i >> 4); + i |= (i >> 8); + i |= (i >> 16); + return i - (i >>> 1); + } + round(value: number): number { + return Math.floor(value +0.5); + } + isRotationRequired(degreesToRotate: number): boolean{ + return degreesToRotate == 90 || degreesToRotate == 270; + // isScaling(options: ESObject): boolean { + // return options.inTargetDensity >0 + // && options.inDensity>0 + // && options.inTargetDensity != options.inDensity; + //} + getDensityMultiplier(adjustedScaleFactor: number):number{ + return Math.round(Number.MAX_VALUE * (adjustedScaleFactor <= 1 ? adjustedScaleFactor : 1 / adjustedScaleFactor)); + } + adjustTargetDensityForError(adjustedScaleFactor:number):number{ + let densityMultiplier = this.getDensityMultiplier(adjustedScaleFactor); + let targetDensity = this.round(densityMultiplier * adjustedScaleFactor); + let scaleFactorWithError = targetDensity / densityMultiplier; + let difference = adjustedScaleFactor / scaleFactorWithError; + return this.round(difference * targetDensity); + } + } \ No newline at end of file From 9c40365fc466466a523606b8a7b2dd0feda5bad6 Mon Sep 17 00:00:00 2001 From: sijainguo <547537959@qq.com> Date: Fri, 26 Apr 2024 22:20:29 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=8F=90=E4=BA=A4=20Downsampler=20?= =?UTF-8?q?=E7=B1=BB=20=E6=8A=A5=E9=94=99=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imageknife/Downsampling/Downsampler.ets | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets b/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets index 568ab4a..2bf9a9e 100644 --- a/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets +++ b/library/src/main/ets/components/imageknife/Downsampling/Downsampler.ets @@ -1,8 +1,8 @@ /* * asdfasdfasdfasdfasdf*/ import { CenterOutside, FitCenter, SampleSizeRounding } from './Downsamplestrategy'; -import { FileTypeutil } from '../../utits/Fitetypeutit'; -import { Request0ption } from '../../Requestoption'; +import { FileTypeUtil } from '../../utits/Fitetypeutit'; +import { RequestOption } from '../../Requestoption'; let TAG = 'downsampling' export class Downsampler { calculateScaling( @@ -37,9 +37,10 @@ export class Downsampler { let exactScaleFactor: number = FitCenter.getScaleFactor(orientedSourceWidth, orientedSourceHeight, targetWidth, targetHeight) if (exactScaleFactor <= 0) { throw new Error("Cannot round with exactScaleFactor"); + } console.log('exactScaleFactor', exactScaleFactor) /*安卓的模式*/ - let rounding: SampleSizeRounding = Center0utside.getSampleSizeRounding(orientedSourceWidth, orientedSourceHeight, targetWidth, targetHeight) + let rounding: SampleSizeRounding = CenterOutside.getSampleSizeRounding(orientedSourceWidth, orientedSourceHeight, targetWidth, targetHeight) if (rounding == null) { throw new Error("Cannot round with null rounding"); } @@ -118,8 +119,9 @@ export class Downsampler { round(value: number): number { return Math.floor(value +0.5); } - isRotationRequired(degreesToRotate: number): boolean{ + isRotationRequired(degreesToRotate: number): boolean { return degreesToRotate == 90 || degreesToRotate == 270; + } // isScaling(options: ESObject): boolean { // return options.inTargetDensity >0 // && options.inDensity>0 @@ -135,4 +137,4 @@ export class Downsampler { let difference = adjustedScaleFactor / scaleFactorWithError; return this.round(difference * targetDensity); } - } \ No newline at end of file + } \ No newline at end of file