下采样设置宽高完成

This commit is contained in:
24186 2024-04-26 21:45:57 +08:00
parent 9a37765b1f
commit 15401bbc32
8 changed files with 114 additions and 13 deletions

View File

@ -1,6 +1,6 @@
{
"hvigorVersion": "3.0.9",
"hvigorVersion": "4.1.2",
"dependencies": {
"@ohos/hvigor-ohos-plugin": "3.0.9"
"@ohos/hvigor-ohos-plugin": "4.1.2"
}
}

View File

@ -1,2 +1,6 @@
/*
* asdfasdfasdfasdfasdf*/
export interface BaseDownsampling{
getScaleFactor(sourceWidth:number, sourceHeight:number, requestWidth:number, requestHeight:number):number
getSampleSizeRounding(sourceWidth:number, sourceHeight:number, requestWidth:number, requestHeight:number):number
}

View File

@ -1,2 +1,79 @@
/*
* dsasdafasdfasdf*/
import { BaseDownsampling } from './BaseDownsampling'
export class CenterInside{
getScaleFactor(sourceWidth:number, sourceHeight:number,requestWidth:number, requestHeight:number):number {
return Math.min(1,FitCenter.getScaleFactor(sourceWidth, sourceHeight, requestWidth, requestHeight))
}
getSampleSizeRounding(sourceWidth:number, sourceHeight:number, requestWidth:number, requestHeight:number):SampleSizeRounding {
return this.getScaleFactor(sourceWidth, sourceHeight, requestWidth, requestHeight)==1
?SampleSizeRounding.QUALITY
:FitCenter.getSampleSizeRounding(sourceWidth, sourceHeight, requestWidth, requestHeight)
}
}
/*不进行下采样*/
export class DownsampleNone implements BaseDownsampling{
getScaleFactor(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
return 1
}
getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
return SampleSizeRounding.QUALITY
}
}
/* 下采样使得图像的组大尺寸在给定的尺寸的1/2之间*/
export class AtMost implements BaseDownsampling{
getScaleFactor(sourceWidth: number, sourceHeight: number, requestWidth:number,requestHeight: number): number {
let maxIntegerFactor=Math.ceil(Math.max(sourceHeight/requestHeight,sourceWidth/requestWidth));
let lesserOrEqualSampleSize = Math.max(1,highestOneBit(maxIntegerFactor))
let greaterOrEqualSampleSize = lesserOrEqualSampleSize<<(lesserOrEqualSampleSize<maxIntegerFactor?1:0)
return 1/greaterOrEqualSampleSize
}
getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
return SampleSizeRounding.MEMORY
}
}
export class Atleast implements BaseDownsampling{
getScaleFactor(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
let minIntegerFactor=Math.floor(Math.min(sourceHeight/requestHeight,sourceWidth/requestWidth))
return minIntegerFactor==0?1:1/highestOneBit(minIntegerFactor)
}
getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
return SampleSizeRounding.QUALITY
}
}
export class CenterOutside implements BaseDownsampling{
getScaleFactor(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
let widthPercentage =requestWidth/sourceWidth
let heightPercentage =requestHeight/sourceHeight
return Math.max(widthPercentage,heightPercentage)
}
getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
return SampleSizeRounding.QUALITY
}
}
export class FitCenter{
public static getScaleFactor(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
let widthPercentage =requestWidth/sourceWidth
let heightPercentage =requestHeight/sourceHeight
return Math.min(widthPercentage,heightPercentage)
}
public static getSampleSizeRounding(sourceWidth: number, sourceHeight: number, requestWidth: number, requestHeight: number): number {
return SampleSizeRounding.MEMORY
}
}
export enum SampleSizeRounding{
MEMORY,
QUALITY
}

View File

@ -242,6 +242,9 @@ export struct ImageKnifeComponent {
if (this.imageKnifeOption.signature) {
request.signature = this.imageKnifeOption.signature;
}
if(this.imageKnifeOption.downsampling){
request.downsampleStrategy(this.imageKnifeOption.downsampling)
}
}
configDisplay(request: RequestOption) {

View File

@ -60,6 +60,7 @@ import { SparkMD5 } from '../3rd_party/sparkmd5/spark-md5'
import { FileUtils } from '../cache/FileUtils'
import util from '@ohos.util'
import { DataFetchResult } from './networkmanage/DataFetchResult'
import { BaseDownsampling } from './Downsampling/BaseDownsampling'
export interface Size {
width: number,
@ -106,6 +107,8 @@ export class RequestOption {
uuid: string = '' // 唯一标识
loadSrc: string | PixelMap | Resource = '';
strategy: DiskStrategy = new AUTOMATIC();
//下采样相关
downsampType: BaseDownsampling = new BaseDownsamplings()
dontAnimateFlag = false;
placeholderSrc: string | PixelMap | Resource | undefined = undefined;
placeholderFunc: AsyncSuccess<ImageKnifeData> | undefined = undefined;
@ -502,6 +505,10 @@ export class RequestOption {
this.gpuEnabled = true;
return this;
}
downsampleStrategy(downsampType: ESObject){
this.downsampType = downsampType
return this;
}
// 占位图解析成功
placeholderOnComplete = (imageKnifeData:ImageKnifeData) => {

View File

@ -13,8 +13,10 @@
* limitations under the License.
*/
import { BusinessError } from '@ohos.base'
import { RequestOption } from '../RequestOption';
export interface IParseImage<T> {
parseImage:(imageinfo:ArrayBuffer, onCompleteFunction:(value:T)=>void | PromiseLike<T>, onErrorFunction:(reason?:BusinessError|string)=>void)=>void;
parseImage:(imageinfo:ArrayBuffer, onCompleteFunction:(value:T)=>void | PromiseLike<T>, onErrorFunction:(reason?:BusinessError|string)=>void,request?:RequestOption)=>void;
parseImageThumbnail:(scale:number, imageinfo:ArrayBuffer, onCompleteFunction:(value:T)=>void | PromiseLike<T>,
onErrorFunction:(reason?:BusinessError|string)=>void)=>void;
}

View File

@ -188,7 +188,7 @@ export class RequestManager {
let success = (value: PixelMap) => {
onComplete(value);
}
this.mParseImageUtil.parseImage(arrayBuffer, success, onError)
this.mParseImageUtil.parseImage(arrayBuffer, success, onError,request)
}
}
}

View File

@ -16,15 +16,14 @@
import { IParseImage } from '../interface/IParseImage'
import image from '@ohos.multimedia.image';
import { BusinessError } from '@ohos.base'
import taskpool from '@ohos.taskpool';
import { LogUtil } from './LogUtil';
import { RequestOption } from '../RequestOption';
export class ParseImageUtil implements IParseImage<PixelMap> {
parseImage(imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike<PixelMap>, onErrorFunction: (reason?: BusinessError | string) => void) {
this.parseImageThumbnail(1, imageinfo, onCompleteFunction, onErrorFunction)
parseImage(imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike<PixelMap>, onErrorFunction: (reason?: BusinessError | string) => void,request?:RequestOption) {
this.parseImageThumbnail(1, imageinfo, onCompleteFunction, onErrorFunction,request)
}
parseImageThumbnail(scale: number, imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike<PixelMap>, onErrorFunction: (reason?: BusinessError | string) => void) {
parseImageThumbnail(scale: number, imageinfo: ArrayBuffer, onCompleteFunction: (value: PixelMap) => void | PromiseLike<PixelMap>, onErrorFunction: (reason?: BusinessError | string) => void,request?:RequestOption) {
let imageSource: image.ImageSource = image.createImageSource(imageinfo); // 步骤一文件转为pixelMap 然后变换 给Image组件
imageSource.getImageInfo().then((value) => {
@ -38,6 +37,15 @@ export class ParseImageUtil implements IParseImage<PixelMap> {
editable: true,
desiredSize: defaultSize
};
const b = new Downsamper(imageinfo, hValue, wValue, requ,request)
let options: image.DecodingOptions = {
editable: true,
desiredSize: {
height: b.targetHeight,
width: b.targetWidth
}
};
imageSource.createPixelMap(opts).then((pixelMap: image.PixelMap) => {
onCompleteFunction(pixelMap);