降采样适配3.x

Signed-off-by: tsm <2418639820@qq.com>
This commit is contained in:
tsm 2024-05-22 15:56:09 +08:00
parent 2ace95a345
commit 488619cd18
1 changed files with 5 additions and 51 deletions

View File

@ -14,13 +14,11 @@
*/ */
import { BaseDownsampling } from './BaseDownsampling'; import { BaseDownsampling } from './BaseDownsampling';
import { highestOneBit,SampleSizeRounding } from './downsampleUtils'; import { highestOneBit,SampleSizeRounding } from './downsampleUtils';
//FitCenter类实现DownsampleStartegy
@Sendable @Sendable
export class FitCenter implements BaseDownsampling { export class FitCenter implements BaseDownsampling {
getName() { getName() {
return "FitCenter" return "FitCenter"
} }
//实现 getScaleFactor 方法 //实现 getScaleFactor 方法
getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): number { getScaleFactor(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; //这里需要根据实际情况设置这个值
@ -43,22 +41,16 @@ export class FitCenter implements BaseDownsampling {
if (!IS_BITMAP_FACTORY_SCALING_SUPPORTED) { if (!IS_BITMAP_FACTORY_SCALING_SUPPORTED) {
return 0; return 0;
} else { } else {
// TODO: 这个逻辑可能不正确,但是如果不这样做,我们可能会跳过一个采样尺寸,因为 QUALITY 更喜欢宽度和高度缩放因子中比较小的那个
// MEMORY 折中方案,他让我们更喜欢两者中较大的那个
return SampleSizeRounding.MEMORY; return SampleSizeRounding.MEMORY;
} }
} }
} }
//None 类实现 DownsampleStrategy 接口
@Sendable @Sendable
export class None implements BaseDownsampling{ export class None implements BaseDownsampling{
getName(): string{ getName(): string{
return "DownsampleNone" return "DownsampleNone"
} }
//实现 getScaleFactor 方法
public getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number { public getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
//不进行任何下采样,缩放因子为 1 //不进行任何下采样,缩放因子为 1
return 1; return 1;
@ -66,7 +58,6 @@ export class None implements BaseDownsampling{
//实现 getSampleSizeRounding 方法 //实现 getSampleSizeRounding 方法
public getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding { public getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding {
//总是返回 QUALITY
return SampleSizeRounding.QUALITY return SampleSizeRounding.QUALITY
} }
@ -81,7 +72,6 @@ export class CenterOutside implements BaseDownsampling {
return "CenterOutside" return "CenterOutside"
} }
//实现 getScaleFactor 方法
getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number { getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
const widthPercentage = requestedWidth / sourceWidth; const widthPercentage = requestedWidth / sourceWidth;
const heightPercentage = requestedHeight / sourceHeight; const heightPercentage = requestedHeight / sourceHeight;
@ -89,7 +79,6 @@ export class CenterOutside implements BaseDownsampling {
return Math.max(widthPercentage, heightPercentage); return Math.max(widthPercentage, heightPercentage);
} }
//实现 getSampleSizeRounding 方法
getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding { getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding {
//根据 CenterOutside 的逻辑,总是返回 QUALITY //根据 CenterOutside 的逻辑,总是返回 QUALITY
return SampleSizeRounding.QUALITY; return SampleSizeRounding.QUALITY;
@ -99,11 +88,6 @@ export class CenterOutside implements BaseDownsampling {
/*请求尺寸大于实际尺寸不进行放大,按照原图展示*/ /*请求尺寸大于实际尺寸不进行放大,按照原图展示*/
@Sendable @Sendable
export class Atleast implements BaseDownsampling { export class Atleast implements BaseDownsampling {
//构造函数
constructor(){
//TypeScript 默认构造函数不需要特殊标记
}
getName() { getName() {
return "AtLeast" return "AtLeast"
} }
@ -115,7 +99,6 @@ export class Atleast implements BaseDownsampling {
//根据最小整数因子计算缩放因子 //根据最小整数因子计算缩放因子
return minIntegerFactor === 0 ? 1 : 1 / highestOneBit(minIntegerFactor); return minIntegerFactor === 0 ? 1 : 1 / highestOneBit(minIntegerFactor);
} }
//实现 getSampleSizeRounding 方法
public getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding { public getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding {
//总是返回 QUALITY //总是返回 QUALITY
return SampleSizeRounding.QUALITY return SampleSizeRounding.QUALITY
@ -134,24 +117,15 @@ export class AtMost implements BaseDownsampling {
const maxIntegerFactor = Math.ceil(Math.max(sourceHeight / requestedHeight, sourceWidth / requestedWidth)); const maxIntegerFactor = Math.ceil(Math.max(sourceHeight / requestedHeight, sourceWidth / requestedWidth));
let lesserOrEqualSampleSize = Math.max(1, highestOneBit(maxIntegerFactor)); let lesserOrEqualSampleSize = Math.max(1, highestOneBit(maxIntegerFactor));
let greaterOrEqualSampleSize = lesserOrEqualSampleSize let greaterOrEqualSampleSize = lesserOrEqualSampleSize
// if (lesserOrEqualSampleSize < maxIntegerFactor) { if (lesserOrEqualSampleSize < maxIntegerFactor) {
// let greaterOrEqualSampleSize = lesserOrEqualSampleSize <<= 1; // lest shift by 1 greaterOrEqualSampleSize = lesserOrEqualSampleSize <<= 1;
// } }
greaterOrEqualSampleSize = lesserOrEqualSampleSize << (lesserOrEqualSampleSize < maxIntegerFactor ? 1 : 0) greaterOrEqualSampleSize = lesserOrEqualSampleSize << (lesserOrEqualSampleSize < maxIntegerFactor ? 1 : 0)
//返回缩放因子 //返回缩放因子
return 1 / greaterOrEqualSampleSize 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 { getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestHeight: number): SampleSizeRounding {
//根据 AtMost 的逻辑,总是返回 MEMORY //根据 AtMost 的逻辑,总是返回 MEMORY
return SampleSizeRounding.MEMORY return SampleSizeRounding.MEMORY
@ -166,18 +140,16 @@ export class CenterInside implements BaseDownsampling {
return "CenterInside" return "CenterInside"
} }
//实现 getScaleFactor 方法
getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): number { getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): number {
//获取 FIT_CENTER 的缩放因子 //获取 FIT_CENTER 的缩放因子
const fitCenterScaleFactor : ESObject = this.getScale(sourceWidth,sourceHeight,requestedWidth,requestedHeight,autoResize); const fitCenterScaleFactor : ESObject = this.getScale(sourceWidth,sourceHeight,requestedWidth,requestedHeight,autoResize);
//实现 getScaleFactor 方法
//返回不超过 1 的缩放因子,即尽量缩小图像以适应目标尺寸,但不会放大 //返回不超过 1 的缩放因子,即尽量缩小图像以适应目标尺寸,但不会放大
return Math.min(1,fitCenterScaleFactor); return Math.min(1,fitCenterScaleFactor);
} }
getScale(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): number { 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) { if (IS_BITMAP_FACTORY_SCALING_SUPPORTED) {
const widthPercentage = requestedWidth / sourceWidth const widthPercentage = requestedWidth / sourceWidth
const heightPercentage = requestedHeight / sourceHeight 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 { getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number,autoResize?:boolean): SampleSizeRounding {
//如果缩放因子为 1表示没有缩放优先选择质量 //如果缩放因子为 1表示没有缩放优先选择质量
if (this.getScaleFactor(sourceWidth,sourceHeight,requestedWidth,requestedHeight,autoResize) === 1) { if (this.getScaleFactor(sourceWidth,sourceHeight,requestedWidth,requestedHeight,autoResize) === 1) {
@ -201,27 +170,12 @@ export class CenterInside implements BaseDownsampling {
//否则,使用 FIL_CENTER 的 SampleSizeRounding 值 //否则,使用 FIL_CENTER 的 SampleSizeRounding 值
return this.getSampleSize(sourceWidth,sourceHeight,requestedWidth,requestedHeight); 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 { 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) { if (IS_BITMAP_FACTORY_SCALING_SUPPORTED) {
return 0; return 0;
} else { } else {
// TODO: 这个逻辑可能不正确,但是如果不这样做,我们可能会跳过一个采样尺寸,因为 QUALITY 更喜欢宽度和高度缩放因子中比较小的那个
// MEMORY 折中方案,他让我们更喜欢两者中较大的那个
//
// }
return SampleSizeRounding.MEMORY; return SampleSizeRounding.MEMORY;
} }
} }