From 488619cd18bdb08b7cedf7eee346948c5564b364 Mon Sep 17 00:00:00 2001 From: tsm <2418639820@qq.com> Date: Wed, 22 May 2024 15:56:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=8D=E9=87=87=E6=A0=B7=E9=80=82=E9=85=8D3.?= =?UTF-8?q?x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tsm <2418639820@qq.com> --- .../ets/downsampling/DownsampleStartegy.ets | 56 ++----------------- 1 file changed, 5 insertions(+), 51 deletions(-) diff --git a/library/src/main/ets/downsampling/DownsampleStartegy.ets b/library/src/main/ets/downsampling/DownsampleStartegy.ets index 7d02b94..6d181a6 100644 --- a/library/src/main/ets/downsampling/DownsampleStartegy.ets +++ b/library/src/main/ets/downsampling/DownsampleStartegy.ets @@ -14,13 +14,11 @@ */ import { BaseDownsampling } from './BaseDownsampling'; import { highestOneBit,SampleSizeRounding } from './downsampleUtils'; -//FitCenter类实现DownsampleStartegy @Sendable export class FitCenter implements BaseDownsampling { getName() { return "FitCenter" } - //实现 getScaleFactor 方法 getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): number { const IS_BITMAP_FACTORY_SCALING_SUPPORTED = autoResize; //这里需要根据实际情况设置这个值 @@ -43,22 +41,16 @@ export class FitCenter implements BaseDownsampling { if (!IS_BITMAP_FACTORY_SCALING_SUPPORTED) { return 0; } else { - // TODO: 这个逻辑可能不正确,但是如果不这样做,我们可能会跳过一个采样尺寸,因为 QUALITY 更喜欢宽度和高度缩放因子中比较小的那个 - // MEMORY 折中方案,他让我们更喜欢两者中较大的那个 return SampleSizeRounding.MEMORY; } } } - -//None 类实现 DownsampleStrategy 接口 @Sendable export class None implements BaseDownsampling{ getName(): string{ return "DownsampleNone" } - - //实现 getScaleFactor 方法 public getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number { //不进行任何下采样,缩放因子为 1 return 1; @@ -66,7 +58,6 @@ export class None implements BaseDownsampling{ //实现 getSampleSizeRounding 方法 public getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding { - //总是返回 QUALITY return SampleSizeRounding.QUALITY } @@ -81,7 +72,6 @@ export class CenterOutside implements BaseDownsampling { return "CenterOutside" } - //实现 getScaleFactor 方法 getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number { const widthPercentage = requestedWidth / sourceWidth; const heightPercentage = requestedHeight / sourceHeight; @@ -89,7 +79,6 @@ export class CenterOutside implements BaseDownsampling { return Math.max(widthPercentage, heightPercentage); } - //实现 getSampleSizeRounding 方法 getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding { //根据 CenterOutside 的逻辑,总是返回 QUALITY return SampleSizeRounding.QUALITY; @@ -99,11 +88,6 @@ export class CenterOutside implements BaseDownsampling { /*请求尺寸大于实际尺寸不进行放大,按照原图展示*/ @Sendable export class Atleast implements BaseDownsampling { - //构造函数 - constructor(){ - //TypeScript 默认构造函数不需要特殊标记 - } - getName() { return "AtLeast" } @@ -115,7 +99,6 @@ export class Atleast implements BaseDownsampling { //根据最小整数因子计算缩放因子 return minIntegerFactor === 0 ? 1 : 1 / highestOneBit(minIntegerFactor); } - //实现 getSampleSizeRounding 方法 public getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding { //总是返回 QUALITY return SampleSizeRounding.QUALITY @@ -134,24 +117,15 @@ export class AtMost implements BaseDownsampling { const maxIntegerFactor = Math.ceil(Math.max(sourceHeight / requestedHeight, sourceWidth / requestedWidth)); let lesserOrEqualSampleSize = Math.max(1, highestOneBit(maxIntegerFactor)); let greaterOrEqualSampleSize = lesserOrEqualSampleSize - // if (lesserOrEqualSampleSize < maxIntegerFactor) { - // let greaterOrEqualSampleSize = lesserOrEqualSampleSize <<= 1; // lest shift by 1 - // } + if (lesserOrEqualSampleSize < maxIntegerFactor) { + greaterOrEqualSampleSize = lesserOrEqualSampleSize <<= 1; + } greaterOrEqualSampleSize = lesserOrEqualSampleSize << (lesserOrEqualSampleSize < maxIntegerFactor ? 1 : 0) //返回缩放因子 return 1 / greaterOrEqualSampleSize } - highestOneBit(i: number): number { - i |= (i >> 1); - i |= (i >> 2); - i |= (i >> 4); - i |= (i >> 8); - i |= (i >> 16); - return i - (i >>> 1); - } - //实现 getSampleSizeRounding 方法 getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestHeight: number): SampleSizeRounding { //根据 AtMost 的逻辑,总是返回 MEMORY return SampleSizeRounding.MEMORY @@ -166,18 +140,16 @@ export class CenterInside implements BaseDownsampling { return "CenterInside" } - //实现 getScaleFactor 方法 getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): number { //获取 FIT_CENTER 的缩放因子 const fitCenterScaleFactor : ESObject = this.getScale(sourceWidth,sourceHeight,requestedWidth,requestedHeight,autoResize); - //实现 getScaleFactor 方法 //返回不超过 1 的缩放因子,即尽量缩小图像以适应目标尺寸,但不会放大 return Math.min(1,fitCenterScaleFactor); } getScale(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): number { - const IS_BITMAP_FACTORY_SCALING_SUPPORTED = autoResize; //这里需要根据实际情况设置这个值 + const IS_BITMAP_FACTORY_SCALING_SUPPORTED = autoResize; if (IS_BITMAP_FACTORY_SCALING_SUPPORTED) { const widthPercentage = requestedWidth / sourceWidth const heightPercentage = requestedHeight / sourceHeight @@ -190,9 +162,6 @@ export class CenterInside implements BaseDownsampling { } } - - - //实现 getSampleSizeRounding 方法 getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): SampleSizeRounding { //如果缩放因子为 1,表示没有缩放,优先选择质量 if (this.getScaleFactor(sourceWidth,sourceHeight,requestedWidth,requestedHeight,autoResize) === 1) { @@ -201,27 +170,12 @@ export class CenterInside implements BaseDownsampling { //否则,使用 FIL_CENTER 的 SampleSizeRounding 值 return this.getSampleSize(sourceWidth,sourceHeight,requestedWidth,requestedHeight); } - - highestOneBit(i: number): number { - i |= (i >> 1); - i |= (i >> 2); - i |= (i >> 4); - i |= (i >> 8); - i |= (i >> 16); - return i - (i >>> 1); - } - - //实现 getSampleSizeRounding 方法 getSampleSize(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): SampleSizeRounding { - const IS_BITMAP_FACTORY_SCALING_SUPPORTED = autoResize; //这里需要根据实际情况设置这个值 + const IS_BITMAP_FACTORY_SCALING_SUPPORTED = autoResize; if (IS_BITMAP_FACTORY_SCALING_SUPPORTED) { return 0; } else { - // TODO: 这个逻辑可能不正确,但是如果不这样做,我们可能会跳过一个采样尺寸,因为 QUALITY 更喜欢宽度和高度缩放因子中比较小的那个 - // MEMORY 折中方案,他让我们更喜欢两者中较大的那个 - // - // } return SampleSizeRounding.MEMORY; } }