1.transform code optimization

Signed-off-by: zhoulisheng <635547767@qq.com>
This commit is contained in:
zhoulisheng 2022-04-07 11:46:10 +08:00
parent e5b00ce028
commit d60369beba
22 changed files with 909 additions and 678 deletions

View File

@ -13,11 +13,11 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
import {fastBlur} from "../utils/FastBlur" import {fastBlur} from "../utils/FastBlur"

View File

@ -13,11 +13,10 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
@ -74,58 +73,24 @@ export class BrightnessFilterTransformation implements BaseTransform<PixelMap> {
} }
} }
let data = await imageSource.createPixelMap(options); let data = await imageSource.createPixelMap(options);
let readPromise;
let writePromise;
for (let w = 0;w <= targetWidth; w++) { let bufferData = new ArrayBuffer(data.getPixelBytesNumber());
for (let h = 0;h <= targetHeight; h++) { await data.readPixelsToBuffer(bufferData);
var buffer = new ArrayBuffer(5);
readPromise = new Promise<void>((resolve, reject) => { var dataArray = new Uint8Array(bufferData);
var positionRen = {
pixels: buffer,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
data.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
for (let index = 0; index < dataArray.length; index += 4) {
writePromise = new Promise<void>((resolve, reject) => { dataArray[index] = this.checkVisAble(dataArray[index] * this._mBrightness + dataArray[index]);
var bytes = new Uint8Array(buffer); dataArray[index+1] = this.checkVisAble(dataArray[index+1] * this._mBrightness + dataArray[index+1]);
var buffer1B = new ArrayBuffer(5); dataArray[index+2] = this.checkVisAble(dataArray[index+2] * this._mBrightness + dataArray[index+2]);
var bytes1B = new Uint8Array(buffer1B); dataArray[index+3] = this.checkVisAble(dataArray[index+3] * this._mBrightness + dataArray[index+3]);
var writePositionRenB = {
pixels: buffer1B,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
bytes1B[0] = bytes[0];
bytes1B[1] = this.checkVisAble(bytes[1] * this._mBrightness + bytes[1]);
bytes1B[2] = this.checkVisAble(bytes[2] * this._mBrightness + bytes[2]);
bytes1B[3] = this.checkVisAble(bytes[3] * this._mBrightness + bytes[3]);
bytes1B[4] = bytes[4];
data.writePixels(writePositionRenB, () => {
resolve();
});
})
await writePromise;
}
} }
await data.writeBufferToPixels(bufferData);
if (func) {
func("", data); func("", data);
}
} }
private checkVisAble(input: number) { private checkVisAble(input: number) {

View File

@ -13,10 +13,10 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
@ -86,58 +86,24 @@ export class ContrastFilterTransformation implements BaseTransform<PixelMap> {
} }
let data = await imageSource.createPixelMap(options); let data = await imageSource.createPixelMap(options);
let readPromise;
let writePromise;
for (let w = 0;w <= targetWidth; w++) { let bufferData = new ArrayBuffer(data.getPixelBytesNumber());
for (let h = 0;h <= targetHeight; h++) { await data.readPixelsToBuffer(bufferData);
var buffer = new ArrayBuffer(5);
readPromise = new Promise<void>((resolve, reject) => { var dataArray = new Uint8Array(bufferData);
var positionRen = {
pixels: buffer,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
data.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
writePromise = new Promise<void>((resolve, reject) => {
var bytes = new Uint8Array(buffer);
var buffer1B = new ArrayBuffer(5);
var bytes1B = new Uint8Array(buffer1B);
var writePositionRenB = {
pixels: buffer1B,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
let brightness = 0; //亮度的偏移量可以默认0 let brightness = 0; //亮度的偏移量可以默认0
for (let index = 0; index < dataArray.length; index += 4) {
bytes1B[0] = bytes[0]; dataArray[index] = this.checkVisAble((dataArray[index] - 127) * this._mContrast + brightness + 127);
bytes1B[1] = this.checkVisAble((bytes[1] - 127) * this._mContrast + brightness + 127); dataArray[index+1] = this.checkVisAble((dataArray[index+1] - 127) * this._mContrast + brightness + 127);
bytes1B[2] = this.checkVisAble((bytes[2] - 127) * this._mContrast + brightness + 127); dataArray[index+2] = this.checkVisAble((dataArray[index+2] - 127) * this._mContrast + brightness + 127);
bytes1B[3] = this.checkVisAble((bytes[3] - 127) * this._mContrast + brightness + 127); dataArray[index+3] = this.checkVisAble((dataArray[index+3] - 127) * this._mContrast + brightness + 127);
bytes1B[4] = bytes[4];
data.writePixels(writePositionRenB, () => {
resolve();
});
})
await writePromise;
}
} }
await data.writeBufferToPixels(bufferData);
if (func) {
func("", data); func("", data);
}
} }
private checkVisAble(input: number) { private checkVisAble(input: number) {

View File

@ -13,12 +13,11 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
export class CropCircleTransformation implements BaseTransform<PixelMap> { export class CropCircleTransformation implements BaseTransform<PixelMap> {
@ -26,7 +25,6 @@ export class CropCircleTransformation implements BaseTransform<PixelMap> {
private mCenterX: number= 0; private mCenterX: number= 0;
private mCenterY: number= 0; private mCenterY: number= 0;
private mRadius: number= 0; private mRadius: number= 0;
private mTransform_pixelMap: any;
getName() { getName() {
return CropCircleTransformation.TAG + ";mCenterX:" + this.mCenterX return CropCircleTransformation.TAG + ";mCenterX:" + this.mCenterX
@ -86,9 +84,8 @@ export class CropCircleTransformation implements BaseTransform<PixelMap> {
}) })
} }
private async transformCircle(p: PixelMap, func?: AsyncTransform<PixelMap>) { private async transformCircle(data: any, func?: AsyncTransform<PixelMap>) {
this.mTransform_pixelMap = p; let imageInfo = await data.getImageInfo();
let imageInfo = await this.mTransform_pixelMap.getImageInfo();
let size = { let size = {
width: imageInfo.size.width, width: imageInfo.size.width,
height: imageInfo.size.height height: imageInfo.size.height
@ -109,37 +106,27 @@ export class CropCircleTransformation implements BaseTransform<PixelMap> {
this.mCenterX = width / 2; this.mCenterX = width / 2;
this.mCenterY = height / 2; this.mCenterY = height / 2;
let writePromise; let bufferData = new ArrayBuffer(data.getPixelBytesNumber());
await data.readPixelsToBuffer(bufferData);
var dataArray = new Uint8Array(bufferData);
for (var h = 0;h <= height; h++) { for (var h = 0;h <= height; h++) {
for (var w = 0;w <= width; w++) { for (var w = 0;w <= width; w++) {
if (this.isContainsCircle(w, h)) { if (this.isContainsCircle(w, h)) {
continue; continue;
} }
writePromise = new Promise<void>((resolve, reject) => { //针对的点
var buffer1 = new ArrayBuffer(5); let index = (h * width + w) * 4;
var bytes1 = new Uint8Array(buffer1); dataArray[index] = 0;
var writePositionRenB = { dataArray[index+1] = 0;
pixels: buffer1, dataArray[index+2] = 0;
offset: 1, dataArray[index+3] = 0;
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
for (let j = 0;j < 5; j++) {
bytes1[j] = 0;
}
this.mTransform_pixelMap.writePixels(writePositionRenB, () => {
resolve();
});
})
await writePromise;
} }
} }
await data.writeBufferToPixels(bufferData);
if (func) { if (func) {
func("", this.mTransform_pixelMap); func("", data);
} }
} }

View File

@ -13,16 +13,15 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
export class CropCircleWithBorderTransformation implements BaseTransform<PixelMap> { export class CropCircleWithBorderTransformation implements BaseTransform<PixelMap> {
private static TAG: string= "CropCircleTransformation"; private static TAG: string= "CropCircleTransformation";
private mTransform_pixelMap: any;
private mBorderSize: number= 5; private mBorderSize: number= 5;
private mCenterX: number= 0; private mCenterX: number= 0;
private mCenterY: number= 0; private mCenterY: number= 0;
@ -104,8 +103,7 @@ export class CropCircleWithBorderTransformation implements BaseTransform<PixelMa
}) })
} }
private async transformPixelMap(pixelMap: PixelMap, width: number, height: number, func?: AsyncTransform<PixelMap>) { private async transformPixelMap(pixelMap: any, width: number, height: number, func?: AsyncTransform<PixelMap>) {
this.mTransform_pixelMap = pixelMap;
this.mRadius = 0; this.mRadius = 0;
if (width > height) { if (width > height) {
this.mRadius = height / 2; this.mRadius = height / 2;
@ -114,8 +112,13 @@ export class CropCircleWithBorderTransformation implements BaseTransform<PixelMa
} }
this.mCenterX = width / 2; this.mCenterX = width / 2;
this.mCenterY = height / 2; this.mCenterY = height / 2;
let readPromise;
let writePromise;
let bufferData = new ArrayBuffer(pixelMap.getPixelBytesNumber());
await pixelMap.readPixelsToBuffer(bufferData);
var dataArray = new Uint8Array(bufferData);
for (let h = 0;h <= height; h++) { for (let h = 0;h <= height; h++) {
for (let w = 0;w <= width; w++) { for (let w = 0;w <= width; w++) {
//不在大圆之内的设置透明 //不在大圆之内的设置透明
@ -127,80 +130,25 @@ export class CropCircleWithBorderTransformation implements BaseTransform<PixelMa
continue; continue;
} }
let index = (h * width + w) * 4;
if (!isBigCircle) { if (!isBigCircle) {
//设置透明 //设置透明
writePromise = new Promise<void>((resolve, reject) => { dataArray[index] = 0;
var buffer1B = new ArrayBuffer(5); dataArray[index+1] = 0;
var bytes1B = new Uint8Array(buffer1B); dataArray[index+2] = 0;
var writePositionRenB = { dataArray[index+3] = 0;
pixels: buffer1B,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
for (let j = 0;j < 5; j++) {
bytes1B[j] = 0;
}
this.mTransform_pixelMap.writePixels(writePositionRenB, () => {
resolve();
});
})
await writePromise;
} else { } else {
//设置broke //设置broke
var buffer = new ArrayBuffer(5); dataArray[index] = this.mRColor;
readPromise = new Promise<void>((resolve, reject) => { dataArray[index+1] = this.mGColor;
var positionRen = { dataArray[index+2] = this.mBColor;
pixels: buffer,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
this.mTransform_pixelMap.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
writePromise = new Promise<void>((resolve, reject) => {
var bytes = new Uint8Array(buffer);
var buffer1 = new ArrayBuffer(5);
var bytes1 = new Uint8Array(buffer1);
var writePositionRen = {
pixels: buffer1,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
for (let j = 0;j < 5; j++) {
if (j == 1 && this.mBColor > 0) {
bytes1[j] = this.mBColor;
} else if (j == 2 && this.mGColor > 0) {
bytes1[j] = this.mGColor;
} else if (j == 3 && this.mRColor > 0) {
bytes1[j] = this.mRColor;
} else {
bytes1[j] = bytes[j];
}
}
this.mTransform_pixelMap.writePixels(writePositionRen, () => {
resolve();
});
})
await writePromise;
} }
} }
} }
await pixelMap.writeBufferToPixels(bufferData);
if (func) { if (func) {
func("", this.mTransform_pixelMap); func("", pixelMap);
} }
} }

View File

@ -13,10 +13,10 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"

View File

@ -13,11 +13,11 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"

View File

@ -13,11 +13,11 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
export class GrayscaleTransformation implements BaseTransform<PixelMap> { export class GrayscaleTransformation implements BaseTransform<PixelMap> {
@ -25,7 +25,6 @@ export class GrayscaleTransformation implements BaseTransform<PixelMap> {
return "GrayscaleTransformation:" + this; return "GrayscaleTransformation:" + this;
} }
async transform(buf: ArrayBuffer, request: RequestOption, func?: AsyncTransform<PixelMap>) { async transform(buf: ArrayBuffer, request: RequestOption, func?: AsyncTransform<PixelMap>) {
if (!buf || buf.byteLength <= 0) { if (!buf || buf.byteLength <= 0) {
console.log(Constants.PROJECT_TAG + ";GrayscaleTransformation buf is empty"); console.log(Constants.PROJECT_TAG + ";GrayscaleTransformation buf is empty");
@ -65,54 +64,31 @@ export class GrayscaleTransformation implements BaseTransform<PixelMap> {
} }
} }
let data = await imageSource.createPixelMap(options); let data = await imageSource.createPixelMap(options);
let readPromise;
let writePromise;
for (let w = 0;w <= targetWidth; w++) {
for (let h = 0;h <= targetHeight; h++) {
var buffer = new ArrayBuffer(5);
readPromise = new Promise<void>((resolve, reject) => {
var positionRen = {
pixels: buffer,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
data.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
writePromise = new Promise<void>((resolve, reject) => { let bufferData = new ArrayBuffer(data.getPixelBytesNumber());
var bytes = new Uint8Array(buffer); let bufferNewData = new ArrayBuffer(data.getPixelBytesNumber());
var buffer1B = new ArrayBuffer(5); await data.readPixelsToBuffer(bufferData);
var bytes1B = new Uint8Array(buffer1B);
var writePositionRenB = { var dataArray = new Uint8Array(bufferData);
pixels: buffer1B, var dataNewArray = new Uint8Array(bufferNewData);
offset: 1,
stride: 1024, for (let index = 0; index < dataArray.length; index += 4) {
region: { size: { width: 1, height: 1 }, const r = dataArray[index];
x: w, const g = dataArray[index+1];
y: h const b = dataArray[index+2];
} const f = dataArray[index+3];
} //b g r
bytes1B[0] = bytes[0]; dataNewArray[index] = this.grayscale(r, g, b);
bytes1B[1] = this.grayscale(bytes[3], bytes[2], bytes[1]); dataNewArray[index+1] = this.grayscale(r, g, b);
bytes1B[2] = this.grayscale(bytes[3], bytes[2], bytes[1]); dataNewArray[index+2] = this.grayscale(r, g, b);
bytes1B[3] = this.grayscale(bytes[3], bytes[2], bytes[1]); dataNewArray[index+3] = f;
bytes1B[4] = bytes[4];
data.writePixels(writePositionRenB, () => {
resolve();
});
})
await writePromise;
}
} }
await data.writeBufferToPixels(bufferNewData);
if (func) {
func('', data); func('', data);
} }
}
/** /**
* 将读取的像素点的rgb值全部灰度化得到灰度图片黑白图片加权平均法 * 将读取的像素点的rgb值全部灰度化得到灰度图片黑白图片加权平均法

View File

@ -13,10 +13,10 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
/** /**
@ -73,55 +73,21 @@ export class InvertFilterTransformation implements BaseTransform<PixelMap> {
} }
let data = await imageSource.createPixelMap(options); let data = await imageSource.createPixelMap(options);
let readPromise;
let writePromise;
for (let w = 0;w <= targetWidth; w++) { let bufferData = new ArrayBuffer(data.getPixelBytesNumber());
for (let h = 0;h <= targetHeight; h++) { await data.readPixelsToBuffer(bufferData);
var buffer = new ArrayBuffer(5);
readPromise = new Promise<void>((resolve, reject) => {
var positionRen = {
pixels: buffer,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
data.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
writePromise = new Promise<void>((resolve, reject) => { var dataArray = new Uint8Array(bufferData);
var bytes = new Uint8Array(buffer);
var buffer1B = new ArrayBuffer(5); for (let index = 0; index < dataArray.length; index += 4) {
var bytes1B = new Uint8Array(buffer1B); dataArray[index] = this.checkVisAble(255 - dataArray[index]);
var writePositionRenB = { dataArray[index+1] = this.checkVisAble(255 - dataArray[index+1]);
pixels: buffer1B, dataArray[index+2] = this.checkVisAble(255 - dataArray[index+2]);
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
} }
await data.writeBufferToPixels(bufferData);
if (func) {
func('', data);
} }
bytes1B[0] = bytes[0];
bytes1B[1] = this.checkVisAble(255 - bytes[1]);
bytes1B[2] = this.checkVisAble(255 - bytes[2]);
bytes1B[3] = this.checkVisAble(255 - bytes[3]);
bytes1B[4] = bytes[4];
data.writePixels(writePositionRenB, () => {
resolve();
});
})
await writePromise;
}
}
func("", data);
} }
private checkVisAble(input: number) { private checkVisAble(input: number) {

View File

@ -0,0 +1,110 @@
/*
* Copyright (C) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption.ets"
import {MaskUtils} from "../utils/MaskUtils.ets"
import image from "@ohos.multimedia.image"
import resmgr from "@ohos.resourceManager"
export class MaskTransformation implements BaseTransform<PixelMap> {
private _mResourceData: Resource;
constructor(maskBitmap: Resource) {
this._mResourceData = maskBitmap;
}
getName() {
return "MaskTransformation:" + this._mResourceData;
}
async transform(buf: ArrayBuffer, request: RequestOption, func?: AsyncTransform<PixelMap>) {
if (!buf || buf.byteLength <= 0) {
console.log(Constants.PROJECT_TAG + ";MaskTransformation buf is empty");
if (func) {
func(Constants.PROJECT_TAG + ";MaskTransformation buf is empty", null);
}
return;
}
var imageSource = image.createImageSource(buf as any);
let imageInfo = await imageSource.getImageInfo();
let size = {
width: imageInfo.size.width,
height: imageInfo.size.height
}
if (!size) {
func(new Error("MaskTransformation The image size does not exist."), null)
return;
}
var pixelMapWidth = size.width;
var pixelMapHeight = size.height;
var targetWidth = request.size.width;
var targetHeight = request.size.height;
if (pixelMapWidth < targetWidth) {
targetWidth = pixelMapWidth;
}
if (pixelMapHeight < targetHeight) {
targetHeight = pixelMapHeight;
}
var options = {
editable: true,
desiredSize: {
width: targetWidth,
height: targetHeight
}
}
imageSource.createPixelMap(options)
.then(data => {
this.openInternal(data, targetWidth, targetHeight, func)
})
.catch(e => {
func(e, null);
})
}
private openInternal(bitmap: any, width: number, height: number, func: AsyncTransform<PixelMap>) {
if (!this._mResourceData) {
throw new Error("MaskTransformation resource is empty");
}
resmgr.getResourceManager()
.then(result => {
result.getMedia(this._mResourceData
.id)
.then(array => {
let buffer = array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset);
var imageSource = image.createImageSource(buffer as any);
var options = {
editable: true,
desiredSize: {
width: width,
height: height
}
}
imageSource.createPixelMap(options)
.then(maskBitmap => {
MaskUtils.mask(bitmap, maskBitmap, func)
})
})
.catch(err => {
func("MaskTransformation openInternal error" + err, null);
})
})
}
}

View File

@ -13,11 +13,11 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
import {pixelUtils} from "../utils/PixelUtils" import {pixelUtils} from "../utils/PixelUtils"

View File

@ -12,11 +12,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"

View File

@ -12,12 +12,12 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {ArcPoint} from "../entry/ArcPoint" import {ArcPoint} from "../entry/ArcPoint.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import {TransformUtils} from "../transform/TransformUtils" import {TransformUtils} from "../transform/TransformUtils.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"

View File

@ -13,10 +13,10 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from "../transform/BaseTransform" import {BaseTransform} from "../transform/BaseTransform.ets"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform.ets"
import {Constants} from "../constants/Constants" import {Constants} from "../constants/Constants.ets"
import {RequestOption} from "../../glide/RequestOption" import {RequestOption} from "../../glide/RequestOption.ets"
import image from "@ohos.multimedia.image" import image from "@ohos.multimedia.image"
/** /**
@ -69,62 +69,37 @@ export class SepiaFilterTransformation implements BaseTransform<PixelMap> {
} }
} }
let data = await imageSource.createPixelMap(options); let data = await imageSource.createPixelMap(options);
let readPromise;
let writePromise;
for (let w = 0;w <= targetWidth; w++) {
for (let h = 0;h <= targetHeight; h++) {
var buffer = new ArrayBuffer(5);
readPromise = new Promise<void>((resolve, reject) => {
var positionRen = {
pixels: buffer,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
data.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
writePromise = new Promise<void>((resolve, reject) => { let bufferData = new ArrayBuffer(data.getPixelBytesNumber());
var bytes = new Uint8Array(buffer); let bufferNewData = new ArrayBuffer(data.getPixelBytesNumber());
var buffer1B = new ArrayBuffer(5); await data.readPixelsToBuffer(bufferData);
var bytes1B = new Uint8Array(buffer1B);
var writePositionRenB = { var dataArray = new Uint8Array(bufferData);
pixels: buffer1B, var dataNewArray = new Uint8Array(bufferNewData);
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: w,
y: h
}
}
bytes1B[0] = bytes[0];
bytes1B[1] = this.checkVisAble(this.colorBlend(this.noise()
, (bytes[3] * 0.272) + (bytes[2] * 0.534) + (bytes[1] * 0.131)
, bytes[1]));
bytes1B[2] = this.checkVisAble(this.colorBlend(this.noise()
, (bytes[3] * 0.349) + (bytes[2] * 0.686) + (bytes[1] * 0.168)
, bytes[2]));
bytes1B[3] = this.checkVisAble(this.colorBlend(this.noise()
, (bytes[3] * 0.393) + (bytes[2] * 0.769) + (bytes[1] * 0.189)
, bytes[3]));
bytes1B[4] = bytes[4];
data.writePixels(writePositionRenB, () => { for (let index = 0; index < dataArray.length; index += 4) {
resolve(); const r = dataArray[index];
}); const g = dataArray[index+1];
}) const b = dataArray[index+2];
await writePromise; const f = dataArray[index+3];
}
dataNewArray[index+2] = this.checkVisAble(this.colorBlend(this.noise()
, (r * 0.272) + (g * 0.534) + (b * 0.131)
, b));
dataNewArray[index+1] = this.checkVisAble(this.colorBlend(this.noise()
, (r * 0.349) + (g * 0.686) + (b * 0.168)
, g));
dataNewArray[index] = this.checkVisAble(this.colorBlend(this.noise()
, (r * 0.393) + (g * 0.769) + (b * 0.189)
, r));
dataNewArray[index+3] = f;
} }
await data.writeBufferToPixels(bufferNewData);
if (func) {
func("", data); func("", data);
} }
}
private checkVisAble(input: number) { private checkVisAble(input: number) {
if (input > 255) { if (input > 255) {

View File

@ -13,11 +13,11 @@
* limitations under the License. * limitations under the License.
*/ */
import {BaseTransform} from '../transform/BaseTransform' import {BaseTransform} from '../transform/BaseTransform.ets'
import {AsyncTransform} from '../transform/AsyncTransform' import {AsyncTransform} from '../transform/AsyncTransform.ets'
import {Constants} from '../constants/Constants' import {Constants} from '../constants/Constants.ets'
import {RequestOption} from '../../glide/RequestOption' import {RequestOption} from '../../glide/RequestOption.ets'
import {TransformUtils} from '../transform/TransformUtils' import {TransformUtils} from '../transform/TransformUtils.ets'
import image from '@ohos.multimedia.image' import image from '@ohos.multimedia.image'
import {CalculatePixelUtils} from '../utils/CalculatePixelUtils' import {CalculatePixelUtils} from '../utils/CalculatePixelUtils'

View File

@ -0,0 +1,182 @@
/*
* Copyright (C) 2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {BaseTransform} from '../transform/BaseTransform.ets'
import {AsyncTransform} from '../transform/AsyncTransform.ets'
import {Constants} from '../constants/Constants.ets'
import {RequestOption} from '../../glide/RequestOption.ets'
import {TransformUtils} from '../transform/TransformUtils.ets'
import image from '@ohos.multimedia.image'
import {PixelEntry} from '../entry/PixelEntry'
import {ColorUtils} from '../utils/ColorUtils'
import {CalculatePixelUtils} from '../utils/CalculatePixelUtils'
export class SwirlFilterTransformation implements BaseTransform<PixelMap> {
private _degree: number;
constructor(degree: number) {
this._degree = degree;
}
getName() {
return 'SwirlFilterTransformation' + this._degree;
}
transform(buf: ArrayBuffer, request: RequestOption, func?: AsyncTransform<PixelMap>) {
if (!buf || buf.byteLength <= 0) {
throw new Error(Constants.PROJECT_TAG + ';SwirlFilterTransformation buf is empty');
if (func) {
func(Constants.PROJECT_TAG + ';SwirlFilterTransformation buf is empty', null);
}
return;
}
var imageSource = image.createImageSource(buf as any);
TransformUtils.getPixelMapSize(imageSource, (error, size: {
width: number,
height: number
}) => {
if (!size) {
func(error, null)
return;
}
var pixelMapWidth = size.width;
var pixelMapHeight = size.height;
var targetWidth = request.size.width;
var targetHeight = request.size.height;
if (pixelMapWidth < targetWidth) {
targetWidth = pixelMapWidth;
}
if (pixelMapHeight < targetHeight) {
targetHeight = pixelMapHeight;
}
var options = {
editable: true,
desiredSize: {
width: targetWidth,
height: targetHeight
}
}
imageSource.createPixelMap(options)
.then((data) => {
this.swirl(data, this._degree, func);
})
.catch((e) => {
func(e, null);
})
})
}
private async swirl(bitmap: any, degree: number, func?: AsyncTransform<PixelMap>) {
let imageInfo = await bitmap.getImageInfo();
let size = {
width: imageInfo.size.width,
height: imageInfo.size.height
}
if (!size) {
return;
}
let width = size.width;
let height = size.height;
let pixEntry: Array<PixelEntry> = new Array();
let rgbData = CalculatePixelUtils.createInt2DArray(height, width);
let bufferData = new ArrayBuffer(bitmap.getPixelBytesNumber());
await bitmap.readPixelsToBuffer(bufferData);
let dataArray = new Uint8Array(bufferData);
let ph = 0;
let pw = 0;
for (let index = 0; index < dataArray.length; index += 4) {
const r = dataArray[index];
const g = dataArray[index+1];
const b = dataArray[index+2];
const f = dataArray[index+3];
let entry = new PixelEntry();
entry.a = 0;
entry.b = b;
entry.g = g;
entry.r = r;
entry.f = f;
entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b);
pixEntry.push(entry);
rgbData[ph][pw] = ColorUtils.rgb(entry.r, entry.g, entry.b);
if (pw == width - 1) {
pw = 0;
ph++;
} else {
pw++;
}
}
let k = degree / 3600;
let cenX = width / 2;
let cenY = height / 2;
let radius = 0;
for (let h = 0;h < height; h++) {
for (let w = 0; w < width; w++) {
let offerX = w - cenX;
let offerY = h - cenY;
let radian = Math.atan2(offerY, offerX)
radius = Math.floor(Math.sqrt(offerX * offerX + offerY * offerY));
let newX = Math.floor(radius * Math.cos(radian + k * radius)) + cenX;
let newY = Math.floor(radius * Math.sin(radian + k * radius)) + cenY;
newX = Math.floor(Math.min(width - 1, Math.max(0, newX)));
newY = Math.floor(Math.min(height - 1, Math.max(0, newY)));
rgbData[h][w] = rgbData[newY][newX];
}
}
let bufferNewData = new ArrayBuffer(bitmap.getPixelBytesNumber());
let dataNewArray = new Uint8Array(bufferNewData);
let index = 0;
let mh = 0;
let nw = 0;
for (let i = 0; i < dataNewArray.length; i += 4) {
let pixel_1 = rgbData[mh][nw];
if (nw == width - 1) {
nw = 0;
mh++;
} else {
nw++;
}
let p_r = ColorUtils.red(pixel_1);
let p_g = ColorUtils.green(pixel_1);
let p_b = ColorUtils.blue(pixel_1);
dataNewArray[i] = p_r;
dataNewArray[i+1] = p_g;
dataNewArray[i+2] = p_b;
dataNewArray[i+3] = pixEntry[index].f;
index++;
}
await bitmap.writeBufferToPixels(bufferNewData);
if (func) {
func("", bitmap);
}
}
}

View File

@ -20,41 +20,29 @@ export namespace CalculatePixelUtils {
var pixEntry: Array<PixelEntry> = new Array() var pixEntry: Array<PixelEntry> = new Array()
var pixSrc: Array<number> = new Array() var pixSrc: Array<number> = new Array()
var pixNvt: Array<number> = new Array() var pixNvt: Array<number> = new Array()
let readPromise;
let writePromise;
for (let h = 0; h < height; h++) { let bufferData = new ArrayBuffer(p.getPixelBytesNumber());
for (let w = 0; w < width; w++) { await p.readPixelsToBuffer(bufferData);
let buffer = new ArrayBuffer(5); let dataArray = new Uint8Array(bufferData);
readPromise = new Promise<void>((resolve, reject) => {
var positionRen = { for (let index = 0; index < dataArray.length; index++) {
pixels: buffer, const r = dataArray[index];
offset: 1, const g = dataArray[index+1];
stride: 1024, const b = dataArray[index+2];
region: { size: { width: 1, height: 1 }, const f = dataArray[index+3];
x: w,
y: h
}
}
p.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
let bytes = new Uint8Array(buffer);
let entry = new PixelEntry(); let entry = new PixelEntry();
entry.a = bytes[0]; entry.a = 0;
entry.b = bytes[1]; entry.b = b;
entry.g = bytes[2]; entry.g = g;
entry.r = bytes[3]; entry.r = r;
entry.f = bytes[4]; entry.f = f;
entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b); entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b);
pixEntry.push(entry); pixEntry.push(entry);
pixSrc.push(ColorUtils.rgb(entry.r, entry.g, entry.b)); pixSrc.push(ColorUtils.rgb(entry.r, entry.g, entry.b));
pixNvt.push(0); pixNvt.push(0);
} }
}
for (row = 0; row < height; row++) { for (row = 0; row < height; row++) {
for (col = 0; col < width; col++) { for (col = 0; col < width; col++) {
pos = row * width + col; pos = row * width + col;
@ -74,36 +62,23 @@ export namespace CalculatePixelUtils {
pixSrc[pos] = ColorUtils.rgb(clr, clr, clr); pixSrc[pos] = ColorUtils.rgb(clr, clr, clr);
} }
} }
for (let m = 0;m < height; m++) { //y
for (let n = 0;n < width; n++) { //x
writePromise = new Promise<void>((resolve, reject) => {
let buffer1B = new ArrayBuffer(5);
let bytes1B = new Uint8Array(buffer1B);
var writePositionRenB = {
pixels: buffer1B,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: n,
y: m
}
}
let index = m * width + n; let bufferNewData = new ArrayBuffer(p.getPixelBytesNumber());
bytes1B[0] = pixEntry[m * width + n].a; let dataNewArray = new Uint8Array(bufferNewData);
bytes1B[1] = ColorUtils.blue(pixSrc[index]); let index = 0;
bytes1B[2] = ColorUtils.green(pixSrc[index]);
bytes1B[3] = ColorUtils.red(pixSrc[index]); for (let i = 0; i < dataNewArray.length; i += 4) {
bytes1B[4] = pixEntry[m * width + n].f; dataNewArray[i] = ColorUtils.red(pixSrc[index]);
p.writePixels(writePositionRenB, () => { dataNewArray[i+1] = ColorUtils.green(pixSrc[index]);
resolve(); dataNewArray[i+2] = ColorUtils.blue(pixSrc[index]);
}); dataNewArray[i+3] = pixEntry[index].f;
}) index++;
await writePromise;
}
} }
await p.writeBufferToPixels(bufferNewData);
if (func) {
func("success", p); func("success", p);
}
} }
function gaussGray(psrc: Array<number>, horz: number, vert: number, function gaussGray(psrc: Array<number>, horz: number, vert: number,

View File

@ -13,7 +13,6 @@
* limitations under the License. * limitations under the License.
*/ */
import image from "@ohos.multimedia.image"
import {CalculatePixelUtils} from "./CalculatePixelUtils" import {CalculatePixelUtils} from "./CalculatePixelUtils"
import {PixelEntry} from "../entry/PixelEntry" import {PixelEntry} from "../entry/PixelEntry"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform"
@ -73,41 +72,27 @@ export namespace fastBlur {
var pixEntry: Array<PixelEntry> = new Array() var pixEntry: Array<PixelEntry> = new Array()
var pix: Array<number> = new Array() var pix: Array<number> = new Array()
let readPromise;
let writePromise;
for (let ph = 0; ph < h; ph++) { let bufferData = new ArrayBuffer(bitmap.getPixelBytesNumber());
for (let pw = 0; pw < w; pw++) { await bitmap.readPixelsToBuffer(bufferData);
let buffer = new ArrayBuffer(5); let dataArray = new Uint8Array(bufferData);
readPromise = new Promise<void>((resolve, reject) => {
var positionRen = { for (let index = 0; index < dataArray.length; index++) {
pixels: buffer, const r = dataArray[index];
offset: 1, const g = dataArray[index+1];
stride: 1024, const b = dataArray[index+2];
region: { size: { width: 1, height: 1 }, const f = dataArray[index+3];
x: pw,
y: ph
}
}
bitmap.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
let bytes = new Uint8Array(buffer);
let entry = new PixelEntry(); let entry = new PixelEntry();
entry.a = bytes[0]; entry.a = 0;
entry.b = bytes[1]; entry.b = b;
entry.g = bytes[2]; entry.g = g;
entry.r = bytes[3]; entry.r = r;
entry.f = bytes[4]; entry.f = f;
entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b); entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b);
pixEntry.push(entry); pixEntry.push(entry);
pix.push(ColorUtils.rgb(entry.r, entry.g, entry.b)); pix.push(ColorUtils.rgb(entry.r, entry.g, entry.b));
} }
}
let wm = w - 1; let wm = w - 1;
let hm = h - 1; let hm = h - 1;
@ -288,33 +273,21 @@ export namespace fastBlur {
} }
} }
for (let m = 0;m < h; m++) { //y
for (let n = 0;n < w; n++) { //x let bufferNewData = new ArrayBuffer(bitmap.getPixelBytesNumber());
writePromise = new Promise<void>((resolve, reject) => { let dataNewArray = new Uint8Array(bufferNewData);
let buffer1B = new ArrayBuffer(5); let index = 0;
let bytes1B = new Uint8Array(buffer1B);
var writePositionRenB = { for (let i = 0; i < dataNewArray.length; i += 4) {
pixels: buffer1B, dataNewArray[i] = ColorUtils.red(pix[index]);
offset: 1, dataNewArray[i+1] = ColorUtils.green(pix[index]);
stride: 1024, dataNewArray[i+2] = ColorUtils.blue(pix[index]);
region: { size: { width: 1, height: 1 }, dataNewArray[i+3] = pixEntry[index].f;
x: n, index++;
y: m
}
}
let index = m * w + n;
bytes1B[0] = pixEntry[m * w + n].a;
bytes1B[1] = ColorUtils.blue(pix[index]);
bytes1B[2] = ColorUtils.green(pix[index]);
bytes1B[3] = ColorUtils.red(pix[index]);
bytes1B[4] = pixEntry[m * w + n].f;
bitmap.writePixels(writePositionRenB, () => {
resolve();
});
})
await writePromise;
}
} }
await bitmap.writeBufferToPixels(bufferNewData);
if (func) {
func("success", bitmap); func("success", bitmap);
} }
} }
}

View File

@ -0,0 +1,130 @@
import {PixelEntry} from "../entry/PixelEntry"
import {AsyncTransform} from "../transform/AsyncTransform"
import {ColorUtils} from "./ColorUtils"
import {CalculatePixelUtils} from "./CalculatePixelUtils"
export class MaskUtils {
static async mask(bitmap: any, maskBitmap: any, func?: AsyncTransform<PixelMap>) {
let imageInfo = await bitmap.getImageInfo();
let size = {
width: imageInfo.size.width,
height: imageInfo.size.height
}
if (!size) {
return;
}
let width = size.width;
let height = size.height;
let rgbData = CalculatePixelUtils.createInt2DArray(height, width);
let bufferData = new ArrayBuffer(bitmap.getPixelBytesNumber());
await bitmap.readPixelsToBuffer(bufferData);
let dataArray = new Uint8Array(bufferData);
let ph = 0;
let pw = 0;
for (let index = 0; index < dataArray.length; index += 4) {
const r = dataArray[index];
const g = dataArray[index+1];
const b = dataArray[index+2];
const f = dataArray[index+3];
let entry = new PixelEntry();
entry.a = 0;
entry.b = b;
entry.g = g;
entry.r = r;
entry.f = f;
entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b);
rgbData[ph][pw] = ColorUtils.rgb(entry.r, entry.g, entry.b);
if (pw == width - 1) {
pw = 0;
ph++;
} else {
pw++;
}
}
let imageInfoMask = await maskBitmap.getImageInfo();
let sizeMask = {
width: imageInfoMask.size.width,
height: imageInfoMask.size.height
}
if (!sizeMask) {
return;
}
let widthMask = sizeMask.width;
let heightMask = sizeMask.height;
let rgbDataMask = CalculatePixelUtils.createInt2DArray(heightMask, widthMask);
let pixEntry: Array<PixelEntry> = new Array();
let bufferData_m = new ArrayBuffer(maskBitmap.getPixelBytesNumber());
await maskBitmap.readPixelsToBuffer(bufferData_m);
let dataArray_m = new Uint8Array(bufferData_m);
let ph_m = 0;
let pw_m = 0;
for (let index = 0; index < dataArray_m.length; index += 4) {
const r = bufferData_m[index];
const g = bufferData_m[index+1];
const b = bufferData_m[index+2];
const f = bufferData_m[index+3];
let entry = new PixelEntry();
entry.a = 0;
entry.b = b;
entry.g = g;
entry.r = r;
entry.f = f;
entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b);
pixEntry.push(entry);
if (entry.r == 0 && entry.g == 0 && entry.r == b) {
rgbDataMask[ph_m][pw_m] = rgbData[ph_m][pw_m];
} else {
rgbDataMask[ph_m][pw_m] = ColorUtils.rgb(entry.r, entry.g, entry.b);
}
if (pw_m == widthMask - 1) {
pw_m = 0;
ph_m++;
} else {
pw_m++;
}
}
let bufferNewData = new ArrayBuffer(maskBitmap.getPixelBytesNumber());
let dataNewArray = new Uint8Array(bufferNewData);
let index = 0;
let mh = 0;
let nw = 0;
for (let i = 0; i < dataNewArray.length; i += 4) {
let pixel_1 = rgbDataMask[mh][nw];
if (nw == widthMask - 1) {
nw = 0;
mh++;
} else {
nw++;
}
let p_r = ColorUtils.red(pixel_1);
let p_g = ColorUtils.green(pixel_1);
let p_b = ColorUtils.blue(pixel_1);
dataNewArray[i] = p_r;
dataNewArray[i+1] = p_g;
dataNewArray[i+2] = p_b;
dataNewArray[i+3] = pixEntry[index].f;
index++;
}
await maskBitmap.writeBufferToPixels(bufferNewData);
if (func) {
func("", maskBitmap);
}
}
}

View File

@ -36,39 +36,38 @@ export namespace pixelUtils {
var pixEntry: Array<PixelEntry> = new Array() var pixEntry: Array<PixelEntry> = new Array()
let inPixels: Array<Array<number>> = CalculatePixelUtils.createInt2DArray(targetHeight, targetWidth); let inPixels: Array<Array<number>> = CalculatePixelUtils.createInt2DArray(targetHeight, targetWidth);
let readPromise;
let writePromise; let bufferData = new ArrayBuffer(bitmap.getPixelBytesNumber());
//读取 await bitmap.readPixelsToBuffer(bufferData);
for (let ph = 0; ph < targetHeight; ph++) { let dataArray = new Uint8Array(bufferData);
for (let pw = 0; pw < targetWidth; pw++) {
let buffer = new ArrayBuffer(5); let ph = 0;
readPromise = new Promise<void>((resolve, reject) => { let pw = 0;
var positionRen = {
pixels: buffer,
offset: 1, for (let index = 0; index < dataArray.length; index++) {
stride: 1024, const r = dataArray[index];
region: { size: { width: 1, height: 1 }, const g = dataArray[index+1];
x: pw, const b = dataArray[index+2];
y: ph const f = dataArray[index+3];
}
}
bitmap.readPixels(positionRen, () => {
resolve();
});
});
await readPromise;
let bytes = new Uint8Array(buffer);
let entry = new PixelEntry(); let entry = new PixelEntry();
entry.a = bytes[0]; entry.a = 0;
entry.b = bytes[1]; entry.b = b;
entry.g = bytes[2]; entry.g = g;
entry.r = bytes[3]; entry.r = r;
entry.f = bytes[4]; entry.f = f;
entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b); entry.pixel = ColorUtils.rgb(entry.r, entry.g, entry.b);
pixEntry.push(entry); pixEntry.push(entry);
inPixels[ph][pw] = ColorUtils.rgb(entry.r, entry.g, entry.b); inPixels[ph][pw] = ColorUtils.rgb(entry.r, entry.g, entry.b);
if (pw == targetWidth - 1) {
pw = 0;
ph++;
} else {
pw++;
} }
} }
var realPixel_W = pixel > targetWidth ? targetWidth : pixel; var realPixel_W = pixel > targetWidth ? targetWidth : pixel;
var realPixel_H = pixel > targetHeight ? targetHeight : pixel; var realPixel_H = pixel > targetHeight ? targetHeight : pixel;
@ -99,38 +98,35 @@ export namespace pixelUtils {
} }
for (let m = 0;m < targetHeight; m++) { //y let bufferNewData = new ArrayBuffer(bitmap.getPixelBytesNumber());
for (let n = 0;n < targetWidth; n++) { //x let dataNewArray = new Uint8Array(bufferNewData);
writePromise = new Promise<void>((resolve, reject) => { let index = 0;
let buffer1B = new ArrayBuffer(5); let mh = 0;
let bytes1B = new Uint8Array(buffer1B); let nw = 0;
let writePositionRenB = {
pixels: buffer1B,
offset: 1,
stride: 1024,
region: { size: { width: 1, height: 1 },
x: n,
y: m
}
}
let index = m * targetWidth + n;
let pxix1 = inPixels[m][n];
let p_b = ColorUtils.blue(pxix1);
let p_g = ColorUtils.green(pxix1);
let p_r = ColorUtils.red(pxix1);
bytes1B[0] = pixEntry[index].a; for (let i = 0; i < dataNewArray.length; i += 4) {
bytes1B[1] = p_b; let pixel_1 = inPixels[mh][nw];
bytes1B[2] = p_g;
bytes1B[3] = p_r; if (nw == targetWidth - 1) {
bytes1B[4] = pixEntry[index].f; nw = 0;
bitmap.writePixels(writePositionRenB, () => { mh++;
resolve(); } else {
}); nw++;
})
await writePromise;
} }
let p_r = ColorUtils.red(pixel_1);
let p_g = ColorUtils.green(pixel_1);
let p_b = ColorUtils.blue(pixel_1);
dataNewArray[i] = p_r;
dataNewArray[i+1] = p_g;
dataNewArray[i+2] = p_b;
dataNewArray[i+3] = pixEntry[index].f;
index++;
} }
await bitmap.writeBufferToPixels(bufferNewData);
if (func) {
func("success", bitmap); func("success", bitmap);
} }
} }
}

View File

@ -12,13 +12,13 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import {RequestOption} from "../glide/RequestOption" import {RequestOption} from "../glide/RequestOption.ets"
import {CropCircleTransformation} from "../glide/transform/CropCircleTransformation" import {CropCircleTransformation} from "../glide/transform/CropCircleTransformation.ets"
import {RoundedCornersTransformation} from "../glide/transform/RoundedCornersTransformation" import {RoundedCornersTransformation} from "../glide/transform/RoundedCornersTransformation.ets"
import {CropCircleWithBorderTransformation} from "../glide/transform/CropCircleWithBorderTransformation" import {CropCircleWithBorderTransformation} from "../glide/transform/CropCircleWithBorderTransformation.ets"
import {RotateImageTransformation} from "../glide/transform/RotateImageTransformation" import {RotateImageTransformation} from "../glide/transform/RotateImageTransformation.ets"
import {CropSquareTransformation} from "../glide/transform/CropSquareTransformation" import {CropSquareTransformation} from "../glide/transform/CropSquareTransformation.ets"
import {CropTransformation} from "../glide/transform/CropTransformation" import {CropTransformation} from "../glide/transform/CropTransformation.ets"
import {CropType} from "../glide/transform/CropTransformation" import {CropType} from "../glide/transform/CropTransformation"
import {GrayscaleTransformation} from "../glide/transform/GrayscaleTransformation" import {GrayscaleTransformation} from "../glide/transform/GrayscaleTransformation"
import {BrightnessFilterTransformation} from "../glide/transform/BrightnessFilterTransformation" import {BrightnessFilterTransformation} from "../glide/transform/BrightnessFilterTransformation"
@ -28,14 +28,16 @@ import {SepiaFilterTransformation} from "../glide/transform/SepiaFilterTransform
import {SketchFilterTransformation} from "../glide/transform/SketchFilterTransformation" import {SketchFilterTransformation} from "../glide/transform/SketchFilterTransformation"
import {BlurTransformation} from "../glide/transform/BlurTransformation" import {BlurTransformation} from "../glide/transform/BlurTransformation"
import {PixelationFilterTransformation} from "../glide/transform/PixelationFilterTransformation" import {PixelationFilterTransformation} from "../glide/transform/PixelationFilterTransformation"
import {PixelMapPack} from "../glide/PixelMapPack"; import {MaskTransformation} from "../glide/transform/MaskTransformation"
import {SwirlFilterTransformation} from "../glide/transform/SwirlFilterTransformation"
import {PixelMapPack} from "../glide/PixelMapPack.ets";
/** /**
* PixelMap transform 示例 * PixelMap transform 示例
*/ */
let mRotate: number = 0; let mRotate: number = 0;
//let mUrl = "https://hbimg.huabanimg.com/cc6af25f8d782d3cf3122bef4e61571378271145735e9-vEVggB" //let mUrl = "https://hbimg.huabanimg.com/cc6af25f8d782d3cf3122bef4e61571378271145735e9-vEVggB"
let mUrl = $r('app.media.transformBase'); let mUrl = $r('app.media.check_big');
@Entry @Entry
@Component @Component
@ -58,6 +60,8 @@ struct TransformPixelMapPage {
@State mSketchPixelMap: PixelMapPack= new PixelMapPack(); @State mSketchPixelMap: PixelMapPack= new PixelMapPack();
@State mBlurPixelMap: PixelMapPack= new PixelMapPack(); @State mBlurPixelMap: PixelMapPack= new PixelMapPack();
@State mPixelPixelMap: PixelMapPack= new PixelMapPack(); @State mPixelPixelMap: PixelMapPack= new PixelMapPack();
@State mSwirlPixelMap: PixelMapPack= new PixelMapPack();
@State mMaskPixelMap: PixelMapPack= new PixelMapPack();
build() { build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
@ -165,9 +169,8 @@ struct TransformPixelMapPage {
this.circleTransformation(); this.circleTransformation();
}); });
Image(this.mCirclePixelMap.pixelMap) Image(this.mCirclePixelMap.pixelMap)
.objectFit(ImageFit.Fill) .width(200)
.width(100) .height(200)
.height(100)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -184,9 +187,8 @@ struct TransformPixelMapPage {
this.circleBorderTransformation(5); this.circleBorderTransformation(5);
}); });
Image(this.mCircleBorderPixelMap.pixelMap) Image(this.mCircleBorderPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .width(200)
.width(100) .height(200)
.height(100)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -207,9 +209,8 @@ struct TransformPixelMapPage {
this.transformRotate(mRotate); this.transformRotate(mRotate);
}); });
Image(this.mRotatePixelMap.pixelMap) Image(this.mRotatePixelMap.pixelMap)
.objectFit(ImageFit.Fill) .width(200)
.width(100) .height(200)
.height(100)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -227,8 +228,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mSquarePixelMap.pixelMap) Image(this.mSquarePixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -294,8 +295,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mGrayscalePixelMap.pixelMap) Image(this.mGrayscalePixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -312,8 +313,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mBrightnessPixelMap.pixelMap) Image(this.mBrightnessPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -330,8 +331,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mContrastPixelMap.pixelMap) Image(this.mContrastPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -348,8 +349,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mInvertPixelMap.pixelMap) Image(this.mInvertPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -367,8 +368,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mSepiaPixelMap.pixelMap) Image(this.mSepiaPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -385,8 +386,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mSketchPixelMap.pixelMap) Image(this.mSketchPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -404,8 +405,8 @@ struct TransformPixelMapPage {
}); });
Image(this.mBlurPixelMap.pixelMap) Image(this.mBlurPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -424,8 +425,46 @@ struct TransformPixelMapPage {
}); });
Image(this.mPixelPixelMap.pixelMap) Image(this.mPixelPixelMap.pixelMap)
.objectFit(ImageFit.Fill) .objectFit(ImageFit.Fill)
.width(100) .width(200)
.height(100) .height(200)
.margin({ top: 10 })
}.margin({ top: 10 });
Column() {
Text("SwirlFilterTransformation").fontColor(Color.Gray).fontSize(16);
Button() {
Text("图片Swirl").fontSize(13).fontColor(Color.White)
}
.height(35)
.width(120)
.margin({ top: 10 })
.onClick(() => {
this.swirlHandlePixelMap();
});
Image(this.mSwirlPixelMap.pixelMap)
.objectFit(ImageFit.Fill)
.width(200)
.height(200)
.margin({ top: 10 })
}.margin({ top: 10 });
Column() {
Text("MaskTransformation").fontColor(Color.Gray).fontSize(16);
Button() {
Text("图片mask").fontSize(13).fontColor(Color.White)
}
.height(35)
.width(120)
.margin({ top: 10 })
.onClick(() => {
this.maskHandlePixelMap($r('app.media.mask_starfish'));
});
Image(this.mMaskPixelMap.pixelMap)
.objectFit(ImageFit.Fill)
.width(200)
.height(200)
.margin({ top: 10 }) .margin({ top: 10 })
}.margin({ top: 10 }); }.margin({ top: 10 });
@ -549,7 +588,7 @@ struct TransformPixelMapPage {
this.mCirclePixelMap = result; this.mCirclePixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(new CropCircleTransformation()) .transform(new CropCircleTransformation())
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -571,7 +610,7 @@ struct TransformPixelMapPage {
this.mCircleBorderPixelMap = result; this.mCircleBorderPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(circleTransformation) .transform(circleTransformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -592,7 +631,7 @@ struct TransformPixelMapPage {
this.mRotatePixelMap = result; this.mRotatePixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -613,7 +652,7 @@ struct TransformPixelMapPage {
this.mSquarePixelMap = result; this.mSquarePixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -664,7 +703,7 @@ struct TransformPixelMapPage {
this.mGrayscalePixelMap = result; this.mGrayscalePixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -686,7 +725,7 @@ struct TransformPixelMapPage {
this.mBrightnessPixelMap = result; this.mBrightnessPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -708,7 +747,7 @@ struct TransformPixelMapPage {
this.mContrastPixelMap = result; this.mContrastPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -730,7 +769,7 @@ struct TransformPixelMapPage {
this.mInvertPixelMap = result; this.mInvertPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -752,7 +791,7 @@ struct TransformPixelMapPage {
this.mSepiaPixelMap = result; this.mSepiaPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -774,7 +813,7 @@ struct TransformPixelMapPage {
this.mSketchPixelMap = result; this.mSketchPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -796,7 +835,7 @@ struct TransformPixelMapPage {
this.mBlurPixelMap = result; this.mBlurPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())
@ -817,7 +856,50 @@ struct TransformPixelMapPage {
this.mPixelPixelMap = result; this.mPixelPixelMap = result;
return false; return false;
}) })
.setImageViewSize({ width: vp2px(100), height: vp2px(100) }) .setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true)
.transform(transformation)
// .diskCacheStrategy(new NONE())
Glide.call(glideOption);
}
/**
*扭曲
*/
swirlHandlePixelMap() {
let glideOption = new RequestOption();
var transformation = new SwirlFilterTransformation(80);
// glideOption.load($r('app.media.photo6'))
glideOption.load(mUrl)
.addListener((err, data) => {
let result = new PixelMapPack();
result.pixelMap = data.glideValue as PixelMap;
this.mSwirlPixelMap = result;
return false;
})
.setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true)
.transform(transformation)
// .diskCacheStrategy(new NONE())
Glide.call(glideOption);
}
/**
*遮罩
*/
maskHandlePixelMap(maskResource: Resource) {
let glideOption = new RequestOption();
var transformation = new MaskTransformation(maskResource);
// glideOption.load($r('app.media.photo6'))
glideOption.load(mUrl)
.addListener((err, data) => {
let result = new PixelMapPack();
result.pixelMap = data.glideValue as PixelMap;
this.mMaskPixelMap = result;
return false;
})
.setImageViewSize({ width: vp2px(200), height: vp2px(200) })
.skipMemoryCache(true) .skipMemoryCache(true)
.transform(transformation) .transform(transformation)
// .diskCacheStrategy(new NONE()) // .diskCacheStrategy(new NONE())

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB