降采样优化

Signed-off-by: tsm <tianshuangming@h-partners.com>
This commit is contained in:
tsm 2024-10-18 15:19:39 +08:00
parent 851d33a5dc
commit 02fae0e740
6 changed files with 29 additions and 26 deletions

View File

@ -327,9 +327,9 @@ Clear the component content in the **aboutToRecycle** lifecycle and trigger imag
| AT_MOST | 请求尺寸大于实际尺寸不进行放大 | | AT_MOST | 请求尺寸大于实际尺寸不进行放大 |
| FIT_CENTER_MEMORY | 两边自适应内存优先 | | FIT_CENTER_MEMORY | 两边自适应内存优先 |
| FIT_CENTER_QUALITY | 两边自适应质量优先 | | FIT_CENTER_QUALITY | 两边自适应质量优先 |
| CENTER_INSIDE_MEMORY | 宽高缩放比最大的比例,进行缩放适配内存优先 | | CENTER_OUTSIDE_MEMORY | 宽高缩放比最大的比例,进行缩放适配内存优先 |
| CENTER_INSIDE_QUALITY | 宽高缩放比最大的比例,进行缩放适配质量优先 | | CENTER_OUTSIDE_QUALITY | 宽高缩放比最大的比例,进行缩放适配质量优先 |
| CENTER_OUTSIDE | 根据宽高的最小的比例,进行适配 | | AT_LEAST | 根据宽高的最小的比例,进行适配 |
### ImageKnife ### ImageKnife
| Parameter | Type | Description | | Parameter | Type | Description |

View File

@ -32,13 +32,16 @@ struct DownSamplePage {
@Local beforeSampling: number = 0 @Local beforeSampling: number = 0
@Local afterSampling: number = 0 @Local afterSampling: number = 0
@Local SamplingList: SamplingType[] = [ @Local SamplingList: SamplingType[] = [
new SamplingType(0, "NONE"),
new SamplingType(7, "AT_LEAST"),
new SamplingType(1, "AT_MOST"), new SamplingType(1, "AT_MOST"),
new SamplingType(2, "FIT_CENTER_MEMORY"), new SamplingType(2, "FIT_CENTER_MEMORY"),
new SamplingType(4, "FIT_CENTER_QUALITY"), new SamplingType(4, "FIT_CENTER_QUALITY"),
new SamplingType(5, "CENTER_INSIDE_MEMORY"), new SamplingType(5, "CENTER_OUTSIDE_MEMORY"),
new SamplingType(6, "CENTER_INSIDE_QUALITY"), new SamplingType(6, "CENTER_OUTSIDE_QUALITY"),
new SamplingType(7, "CENTER_OUTSIDE"), new SamplingType(0, "NONE"),
] ]
@Local checked: boolean = false @Local checked: boolean = false
@ -83,23 +86,23 @@ struct DownSamplePage {
}) })
this.originalPixMap($r('app.media.pngSample')) this.originalPixMap($r('app.media.pngSample'))
this.afterSamplingFunc($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample'))
} else if (value === 'CENTER_INSIDE_MEMORY') { } else if (value === 'CENTER_OUTSIDE_MEMORY') {
this.imageKnifeOption = new ImageKnifeOption({ this.imageKnifeOption = new ImageKnifeOption({
loadSrc: $r('app.media.pngSample'), loadSrc: $r('app.media.pngSample'),
placeholderSrc: $r("app.media.loading"), placeholderSrc: $r("app.media.loading"),
errorholderSrc: $r("app.media.app_icon"), errorholderSrc: $r("app.media.app_icon"),
objectFit: ImageFit.Contain, objectFit: ImageFit.Contain,
downsampleOf: DownsampleStrategy.CENTER_INSIDE_MEMORY downsampleOf: DownsampleStrategy.CENTER_OUTSIDE_MEMORY
}) })
this.originalPixMap($r('app.media.pngSample')) this.originalPixMap($r('app.media.pngSample'))
this.afterSamplingFunc($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample'))
} else if (value === 'CENTER_INSIDE_QUALITY') { } else if (value === 'CENTER_OUTSIDE_QUALITY') {
this.imageKnifeOption = new ImageKnifeOption({ this.imageKnifeOption = new ImageKnifeOption({
loadSrc: $r('app.media.pngSample'), loadSrc: $r('app.media.pngSample'),
placeholderSrc: $r("app.media.loading"), placeholderSrc: $r("app.media.loading"),
errorholderSrc: $r("app.media.app_icon"), errorholderSrc: $r("app.media.app_icon"),
objectFit: ImageFit.Contain, objectFit: ImageFit.Contain,
downsampleOf: DownsampleStrategy.CENTER_INSIDE_QUALITY downsampleOf: DownsampleStrategy.CENTER_OUTSIDE_QUALITY
}) })
this.originalPixMap($r('app.media.pngSample')) this.originalPixMap($r('app.media.pngSample'))
this.afterSamplingFunc($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample'))
@ -109,7 +112,7 @@ struct DownSamplePage {
placeholderSrc: $r("app.media.loading"), placeholderSrc: $r("app.media.loading"),
errorholderSrc: $r("app.media.app_icon"), errorholderSrc: $r("app.media.app_icon"),
objectFit: ImageFit.Contain, objectFit: ImageFit.Contain,
downsampleOf: DownsampleStrategy.CENTER_OUTSIDE downsampleOf: DownsampleStrategy.AT_LEAST
}) })
this.originalPixMap($r('app.media.pngSample')) this.originalPixMap($r('app.media.pngSample'))
this.afterSamplingFunc($r('app.media.pngSample')) this.afterSamplingFunc($r('app.media.pngSample'))

View File

@ -60,17 +60,17 @@ export default function SamplingTest() {
let req = (reqSize.targetWidth < 1024 && reqSize.targetHeight < 1024) let req = (reqSize.targetWidth < 1024 && reqSize.targetHeight < 1024)
expect(req).assertEqual(true); expect(req).assertEqual(true);
}) })
it('CENTER_INSIDE', 3, () => { it('CENTER_OUTSIDE', 3, () => {
let reqSize: calculateScaleType = let reqSize: calculateScaleType =
new Downsampler().calculateScaling('jpg', 1024, 1024, 200, new Downsampler().calculateScaling('jpg', 1024, 1024, 200,
200, DownsampleStrategy.CENTER_INSIDE_MEMORY) 200, DownsampleStrategy.CENTER_OUTSIDE_MEMORY)
let req = (reqSize.targetWidth < 1024 && reqSize.targetHeight < 1024) let req = (reqSize.targetWidth < 1024 && reqSize.targetHeight < 1024)
expect(req).assertEqual(true); expect(req).assertEqual(true);
}) })
it('CENTER_OUTSIDE', 4, () => { it('AT_LEAST', 4, () => {
let reqSize: calculateScaleType = let reqSize: calculateScaleType =
new Downsampler().calculateScaling('jpg', 1024, 1024, 200, new Downsampler().calculateScaling('jpg', 1024, 1024, 200,
200, DownsampleStrategy.CENTER_OUTSIDE) 200, DownsampleStrategy.AT_LEAST)
let req = (reqSize.targetWidth < 1024 && reqSize.targetHeight < 1024) let req = (reqSize.targetWidth < 1024 && reqSize.targetHeight < 1024)
expect(req).assertEqual(true); expect(req).assertEqual(true);
}) })

View File

@ -78,7 +78,7 @@ export class ImageKnifeLoader {
try { try {
if ((request.downsampType !== DownsampleStrategy.NONE) && if ((request.downsampType !== DownsampleStrategy.NONE) &&
request.requestSource == ImageKnifeRequestSource.SRC) { request.requestSource == ImageKnifeRequestSource.SRC) {
decodingOptions = ImageKnifeLoader.downsamplerReqSize(typeValue, request, size, ImageKnifeRequestSource.SRC) decodingOptions = ImageKnifeLoader.getDownsamplerDecodingOptions(typeValue, request, size, ImageKnifeRequestSource.SRC)
} }
} catch (err) { } catch (err) {
return ImageKnifeLoader.makeEmptyResult(err) return ImageKnifeLoader.makeEmptyResult(err)
@ -124,7 +124,7 @@ export class ImageKnifeLoader {
try { try {
if ((request.downsampType !== DownsampleStrategy.NONE) && if ((request.downsampType !== DownsampleStrategy.NONE) &&
request.requestSource == ImageKnifeRequestSource.SRC) { request.requestSource == ImageKnifeRequestSource.SRC) {
opts = ImageKnifeLoader.downsamplerReqSize(typeValue, request, size) opts = ImageKnifeLoader.getDownsamplerDecodingOptions(typeValue, request, size)
} }
} catch (err) { } catch (err) {
return ImageKnifeLoader.makeEmptyResult(err) return ImageKnifeLoader.makeEmptyResult(err)
@ -374,7 +374,7 @@ export class ImageKnifeLoader {
return resBuf return resBuf
} }
static downsamplerReqSize(typeValue: string, request: RequestJobRequest, size: Size, static getDownsamplerDecodingOptions(typeValue: string, request: RequestJobRequest, size: Size,
SRC?: ImageKnifeRequestSource):image.DecodingOptions { SRC?: ImageKnifeRequestSource):image.DecodingOptions {
let reqSize = let reqSize =
new Downsampler().calculateScaling(typeValue, size.width, size.height, request.targetWidth, request.targetHeight, new Downsampler().calculateScaling(typeValue, size.width, size.height, request.targetWidth, request.targetHeight,

View File

@ -126,7 +126,7 @@ export class CenterInside implements BaseDownsampling {
return SampleSizeRounding.QUALITY return SampleSizeRounding.QUALITY
} }
//否则,使用 FIL_CENTER 的 SampleSizeRounding 值 //否则,使用 FIL_CENTER 的 SampleSizeRounding 值
return downsampType === DownsampleStrategy.CENTER_INSIDE_MEMORY?SampleSizeRounding.MEMORY:SampleSizeRounding.QUALITY return downsampType === DownsampleStrategy.CENTER_OUTSIDE_MEMORY?SampleSizeRounding.MEMORY:SampleSizeRounding.QUALITY
} }
} }
@ -138,11 +138,11 @@ export enum DownsampleStrategy {
//两边自适应质量优先 //两边自适应质量优先
FIT_CENTER_QUALITY, FIT_CENTER_QUALITY,
//按照宽高比的最大比进行适配内存优先 //按照宽高比的最大比进行适配内存优先
CENTER_INSIDE_MEMORY, CENTER_OUTSIDE_MEMORY,
//按照宽高比的最大比进行适配质量优先 //按照宽高比的最大比进行适配质量优先
CENTER_INSIDE_QUALITY, CENTER_OUTSIDE_QUALITY,
//宽高进行等比缩放宽高里面最小的比例先放进去,然后再根据原图的缩放比去适配 //宽高进行等比缩放宽高里面最小的比例先放进去,然后再根据原图的缩放比去适配
CENTER_OUTSIDE, AT_LEAST,
//不进行降采样 //不进行降采样
NONE, NONE,
} }

View File

@ -61,10 +61,10 @@ export class Downsampler {
return new FitCenter(); return new FitCenter();
case DownsampleStrategy.AT_MOST: case DownsampleStrategy.AT_MOST:
return new AtMost(); return new AtMost();
case DownsampleStrategy.CENTER_INSIDE_MEMORY: case DownsampleStrategy.CENTER_OUTSIDE_MEMORY:
case DownsampleStrategy.CENTER_INSIDE_QUALITY: case DownsampleStrategy.CENTER_OUTSIDE_QUALITY:
return new CenterInside(); return new CenterInside();
case DownsampleStrategy.CENTER_OUTSIDE: case DownsampleStrategy.AT_LEAST:
return new CenterOutside(); return new CenterOutside();
default: default:
throw new Error('Unsupported downsampling strategy'); throw new Error('Unsupported downsampling strategy');