parent
2ace95a345
commit
488619cd18
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue