parent
68fbe7ef51
commit
620abe6468
|
@ -24,30 +24,13 @@ export class FitCenter implements BaseDownsampling {
|
||||||
|
|
||||||
//实现 getScaleFactor 方法
|
//实现 getScaleFactor 方法
|
||||||
getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
||||||
const IS_BITMAP_FACTORY_SCALING_SUPPORTED = false; //这里需要根据实际情况设置这个值
|
|
||||||
if (IS_BITMAP_FACTORY_SCALING_SUPPORTED) {
|
|
||||||
const widthPercentage = requestedWidth / sourceWidth
|
|
||||||
const heightPercentage = requestedHeight / sourceHeight
|
|
||||||
return Math.min(widthPercentage, heightPercentage)
|
|
||||||
} else {
|
|
||||||
//类似 AT_LEAST,但只要求一个维度或另一个维度大于等于请求的尺寸
|
|
||||||
const maxIntegerFactor = Math.max(sourceHeight / requestedHeight, sourceWidth / requestedWidth);
|
const maxIntegerFactor = Math.max(sourceHeight / requestedHeight, sourceWidth / requestedWidth);
|
||||||
const a = maxIntegerFactor === 0 ? 1 : 1 / highestOneBit(maxIntegerFactor)
|
const a = maxIntegerFactor === 0 ? 1 : 1 / highestOneBit(maxIntegerFactor)
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//实现 getSampleSizeRounding 方法
|
|
||||||
getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
||||||
const IS_BITMAP_FACTORY_SCALING_SUPPORTED = true; //这里需要根据实际情况设置这个值
|
|
||||||
|
|
||||||
// if (!IS_BITMAP_FACTORY_SCALING_SUPPORTED) {
|
|
||||||
// return 0;
|
|
||||||
// } else {
|
|
||||||
// TODO: 这个逻辑可能不正确,但是如果不这样做,我们可能会跳过一个采样尺寸,因为 QUALITY 更喜欢宽度和高度缩放因子中比较小的那个
|
|
||||||
// MEMORY 折中方案,他让我们更喜欢两者中较大的那个
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
return SampleSizeRounding.MEMORY;
|
return SampleSizeRounding.MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,16 +114,10 @@ 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) {
|
|
||||||
// let greaterOrEqualSampleSize = lesserOrEqualSampleSize <<= 1; // lest shift by 1
|
|
||||||
// }
|
|
||||||
greaterOrEqualSampleSize = lesserOrEqualSampleSize << (lesserOrEqualSampleSize < maxIntegerFactor ? 1 : 0)
|
greaterOrEqualSampleSize = lesserOrEqualSampleSize << (lesserOrEqualSampleSize < maxIntegerFactor ? 1 : 0)
|
||||||
//返回缩放因子
|
//返回缩放因子
|
||||||
return 1 / greaterOrEqualSampleSize
|
return 1 / greaterOrEqualSampleSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//实现 getSampleSizeRounding 方法
|
//实现 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
|
||||||
|
@ -159,25 +136,15 @@ export class CenterInside implements BaseDownsampling {
|
||||||
getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
getScaleFactor(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
||||||
//获取 FIT_CENTER 的缩放因子
|
//获取 FIT_CENTER 的缩放因子
|
||||||
const fitCenterScaleFactor: ESObject = this.getScale(sourceWidth, sourceHeight, requestedWidth, requestedHeight);
|
const fitCenterScaleFactor: ESObject = this.getScale(sourceWidth, sourceHeight, requestedWidth, requestedHeight);
|
||||||
//实现 getScaleFactor 方法
|
|
||||||
//返回不超过 1 的缩放因子,即尽量缩小图像以适应目标尺寸,但不会放大
|
//返回不超过 1 的缩放因子,即尽量缩小图像以适应目标尺寸,但不会放大
|
||||||
return Math.min(1, fitCenterScaleFactor);
|
return Math.min(1, fitCenterScaleFactor);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getScale(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
getScale(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): number {
|
||||||
const IS_BITMAP_FACTORY_SCALING_SUPPORTED = false; //这里需要根据实际情况设置这个值
|
//类似 AT_LEAST
|
||||||
if (IS_BITMAP_FACTORY_SCALING_SUPPORTED) {
|
|
||||||
const widthPercentage = requestedWidth / sourceWidth
|
|
||||||
const heightPercentage = requestedHeight / sourceHeight
|
|
||||||
return Math.min(widthPercentage, heightPercentage)
|
|
||||||
} else {
|
|
||||||
//类似 AT_LEAST,但只要求一个维度或另一个维度大于等于请求的尺寸
|
|
||||||
const maxIntegerFactor = Math.max(sourceHeight / requestedHeight, sourceWidth / requestedWidth);
|
const maxIntegerFactor = Math.max(sourceHeight / requestedHeight, sourceWidth / requestedWidth);
|
||||||
|
|
||||||
return maxIntegerFactor === 0 ? 1 : 1 / highestOneBit(maxIntegerFactor);
|
return maxIntegerFactor === 0 ? 1 : 1 / highestOneBit(maxIntegerFactor);
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -190,27 +157,7 @@ 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);
|
||||||
}
|
}
|
||||||
//实现 getSampleSizeRounding 方法
|
|
||||||
getSampleSize(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding {
|
getSampleSize(sourceWidth: number, sourceHeight: number, requestedWidth: number, requestedHeight: number): SampleSizeRounding {
|
||||||
const IS_BITMAP_FACTORY_SCALING_SUPPORTED = true; //这里需要根据实际情况设置这个值
|
|
||||||
|
|
||||||
if (IS_BITMAP_FACTORY_SCALING_SUPPORTED) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
// TODO: 这个逻辑可能不正确,但是如果不这样做,我们可能会跳过一个采样尺寸,因为 QUALITY 更喜欢宽度和高度缩放因子中比较小的那个
|
|
||||||
// MEMORY 折中方案,他让我们更喜欢两者中较大的那个
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
return SampleSizeRounding.MEMORY;
|
return SampleSizeRounding.MEMORY;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum DownsampleStrategy {
|
|
||||||
AT_LEAST,
|
|
||||||
AT_MOST,
|
|
||||||
FIT_CENTER,
|
|
||||||
CENTER_INSIDE,
|
|
||||||
CENTER_OUTSIDE,
|
|
||||||
NONE,
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue