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; } }