diff --git a/README.md b/README.md index f17bd4b..1d43992 100644 --- a/README.md +++ b/README.md @@ -484,6 +484,32 @@ request.skipMemoryCache(true) +其他变换相关属性,可叠加实现组合变换效果 + +圆形裁剪变换示例 + +``` +ImageKnifeComponent({ + imageKnifeOption: { + loadSrc: $r('app.media.jpgSample'), + mainScaleType: ScaleType.CENTER_CROP, + circleCropBorder: { cornerRadius: 150 } + } +}).width(300).height(300) +``` + +圆形裁剪带边框变换示例 + +``` +ImageKnifeComponent({ + imageKnifeOption: { + loadSrc: $r('app.media.jpgSample'), + mainScaleType: ScaleType.CENTER_CROP, + circleCropBorder: { cornerRadius: 150, colorString: Color.Red, borderWidth: 2 } + } +}).width(300).height(300) +``` + ### setLruCacheSize setLruCacheSize(size: number,memory:number): void diff --git a/entry/src/main/ets/pages/transformsPage.ets b/entry/src/main/ets/pages/transformsPage.ets index 7804142..fe61a80 100644 --- a/entry/src/main/ets/pages/transformsPage.ets +++ b/entry/src/main/ets/pages/transformsPage.ets @@ -18,14 +18,12 @@ import { ImageKnifeOption, RotateImageTransformation, SketchFilterTransformation, - CropCircleTransformation, ToonFilterTransform, VignetteFilterTransform, BaseTransform, BlurTransformation, BrightnessFilterTransformation, InvertFilterTransformation, - CropCircleWithBorderTransformation, CropSquareTransformation, CropTransformation, CropType, @@ -35,7 +33,8 @@ import { SepiaFilterTransformation, MaskTransformation, SwirlFilterTransformation, - KuwaharaFilterTransform + KuwaharaFilterTransform, + ScaleType } from '@ohos/libraryimageknife' @Entry @@ -51,9 +50,6 @@ struct transformsPage { private blurTransformation: BlurTransformation = new BlurTransformation(15, 3); private brightnessFilterTransformation: BrightnessFilterTransformation = new BrightnessFilterTransformation(0.5); private contrastFilterTransformation: ContrastFilterTransformation = new ContrastFilterTransformation(2.0); - private cropCircleTransformation: CropCircleTransformation = new CropCircleTransformation(); - private cropCircleWithBorderTransformation: CropCircleWithBorderTransformation = - new CropCircleWithBorderTransformation(16, { r_color: 100, g_color: 100, b_color: 100 }); private cropSquareTransformation: CropSquareTransformation = new CropSquareTransformation(); private cropTransformation: CropTransformation = new CropTransformation(100, 100, CropType.CENTER); private grayscaleTransformation: GrayscaleTransformation = new GrayscaleTransformation(); @@ -73,6 +69,8 @@ struct transformsPage { private kuwaharaFilterTransform: KuwaharaFilterTransform = new KuwaharaFilterTransform(10); private toonFilterTransform: ToonFilterTransform = new ToonFilterTransform(0.3, 10.0); private vignetteFilterTransform: VignetteFilterTransform = new VignetteFilterTransform([0.5, 0.5], [0.0, 0.0, 0.0], [0.3, 0.75]); + private isCropCircle: boolean = false; + private isCropCircleWithBorder: boolean = false; build() { Scroll() { @@ -139,15 +137,7 @@ struct transformsPage { .width(32) .height(32) .onChange((value: boolean) => { - if (value) { - this.transformations.push(this.cropCircleTransformation); - } else { - for (let index = 0; index < this.transformations.length; index++) { - if (this.transformations[index].getClassName() == this.cropCircleTransformation.getClassName()) { - this.transformations.splice(index, 1); - } - } - } + this.isCropCircle = value; }) Text('圆形裁剪').margin({ left: 16 }) }.margin({ left: 16 }) @@ -159,15 +149,7 @@ struct transformsPage { .width(32) .height(32) .onChange((value: boolean) => { - if (value) { - this.transformations.push(this.cropCircleWithBorderTransformation); - } else { - for (let index = 0; index < this.transformations.length; index++) { - if (this.transformations[index].getClassName() == this.cropCircleWithBorderTransformation.getClassName()) { - this.transformations.splice(index, 1); - } - } - } + this.isCropCircleWithBorder = value; }) Text('圆环').margin({ left: 16 }) }.margin({ left: 16 }) @@ -440,22 +422,38 @@ struct transformsPage { }.margin({ top: 32, left: 16 }) Button("显示效果").onClick(() => { - this.imageKnifeOption = { - loadSrc: $r('app.media.jpgSample'), - placeholderSrc: $r('app.media.icon_loading'), - errorholderSrc: $r('app.media.icon_failed'), - enableGpu: true, - transformations: this.transformations - }; + this.updateImageKnifeOption(); }).margin({ left: 5 }).backgroundColor(Color.Blue) Text("下面为展示图片区域").margin({ top: 5 }) Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { - ImageKnifeComponent({ imageKnifeOption: this.imageKnifeOption }).width(300).height(300) - }.width(400).height(400).margin({ top: 10 }).backgroundColor(Color.Pink) + ImageKnifeComponent({ imageKnifeOption: this.imageKnifeOption }) + .width(300) + .height(300) + .backgroundColor(Color.Pink) + }.width(400).height(400).margin({ top: 10 }) } } .width('100%') .height('100%') } + + updateImageKnifeOption() { + this.imageKnifeOption = { + loadSrc: $r('app.media.jpgSample'), + placeholderSrc: $r('app.media.icon_loading'), + errorholderSrc: $r('app.media.icon_failed'), + enableGpu: true, + transformations: this.transformations + } + if (this.isCropCircle) { + this.imageKnifeOption.mainScaleType = ScaleType.CENTER_CROP; + this.imageKnifeOption.circleCropBorder = { cornerRadius: 150 }; + } + if (this.isCropCircleWithBorder) { + this.imageKnifeOption.mainScaleType = ScaleType.CENTER_CROP; + this.imageKnifeOption.circleCropBorder = { cornerRadius: 150, colorString: Color.Red, borderWidth: 2 }; + } + } + } diff --git a/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets b/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets index 436ca30..69486f3 100644 --- a/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets +++ b/library/src/main/ets/components/imageknife/ImageKnifeComponent.ets @@ -678,6 +678,29 @@ export struct ImageKnifeComponent { } ScaleTypeHelper.drawImageWithScaleType(context, scaleType, data.drawPixelMap?.imagePixelMap, px2vp(imageInfo.size.width), px2vp(imageInfo.size.height), compWidth, compHeight, 0, 0) context.restore(); + if (imageKnifeOption.circleCropBorder) { + let borderWidth = imageKnifeOption.circleCropBorder.borderWidth ? imageKnifeOption.circleCropBorder.borderWidth : 0; + let connerRadius = imageKnifeOption.circleCropBorder.cornerRadius ? imageKnifeOption.circleCropBorder.cornerRadius : 0; + // 通过 destination-in 裁剪出圆角 + context.save(); + context.globalCompositeOperation = 'destination-in'; + ImageKnifeDrawFactory.setRect(context, scaleType, data.drawPixelMap?.imagePixelMap, px2vp(imageInfo.size.width), px2vp(imageInfo.size.height), compWidth, + compHeight, 0, 0, borderWidth, connerRadius); + context.fill(); + context.restore(); + if (borderWidth > 0) { + // 为圆角添加边框 + context.save(); + context.strokeStyle = imageKnifeOption.circleCropBorder.colorString ? imageKnifeOption.circleCropBorder.colorString : 0; + context.lineWidth = borderWidth; + context.globalCompositeOperation = 'source-over'; + ImageKnifeDrawFactory.setRect(context, scaleType, data.drawPixelMap?.imagePixelMap, px2vp(imageInfo.size.width), px2vp(imageInfo.size.height), compWidth, + compHeight, 0, 0, borderWidth, connerRadius); + context.stroke(); + context.restore(); + } + context.restore(); + } this.drawMainSourceSuccess = true; LogUtil.log('VISIBLE: ImageKnifeComponent default drawMainSource end!'); }) diff --git a/library/src/main/ets/components/imageknife/ImageKnifeOption.ets b/library/src/main/ets/components/imageknife/ImageKnifeOption.ets index f7a45b2..c1234be 100644 --- a/library/src/main/ets/components/imageknife/ImageKnifeOption.ets +++ b/library/src/main/ets/components/imageknife/ImageKnifeOption.ets @@ -64,6 +64,12 @@ export interface TransformOptions{ rotateImage?: number } +export interface CircleCropBorderOptions { + borderWidth?: number; + cornerRadius?: number; + colorString?: string | number | CanvasGradient | CanvasPattern; +} + export interface HeaderOptions { key: string; value: string; @@ -147,6 +153,9 @@ export class ImageKnifeOption { transformation?: BaseTransform; transformations?: Array>; + // 圆形裁剪 + circleCropBorder?: CircleCropBorderOptions; + // 输出缓存相关内容和信息 allCacheInfoCallback?: IAllCacheInfoCallback;