1.ArkTs整改13 整改imageknife->util

Signed-off-by: zhoulisheng1 <zhoulisheng1@huawei.com>
This commit is contained in:
zhoulisheng1 2023-09-20 14:39:59 +08:00
parent ca0e3fe968
commit 9fedc69e8e
11 changed files with 170 additions and 112 deletions

View File

@ -17,6 +17,7 @@ import { AsyncTransform } from "../transform/AsyncTransform"
import { ColorUtils } from "./ColorUtils"
import { GPUImageSketchFilter } from '@ohos/gpu_transform'
import image from '@ohos.multimedia.image'
import { Size } from '../RequestOption'
export namespace CalculatePixelUtils {
export async function sketch(p: PixelMap, func?: AsyncTransform<PixelMap>) {
@ -26,16 +27,19 @@ export namespace CalculatePixelUtils {
height: imageInfo.size.height
}
if (!size) {
func.asyncTransform("sketch The image size does not exist.", null)
func?.asyncTransform("sketch The image size does not exist.", null)
return;
}
let pos, row, col, clr: number;
let width = size.width;
let height = size.height;
var pixEntry: Array<PixelEntry> = new Array()
var pixSrc: Array<number> = new Array()
var pixNvt: Array<number> = new Array()
let pos: number = 0
let row: number = 0
let col: number = 0
let clr: number = 0
let width: number = size.width;
let height: number = size.height;
let pixEntry: Array<PixelEntry> = new Array()
let pixSrc: Array<number> = new Array()
let pixNvt: Array<number> = new Array()
let bufferData = new ArrayBuffer(p.getPixelBytesNumber());
await p.readPixelsToBuffer(bufferData);
@ -97,10 +101,32 @@ export namespace CalculatePixelUtils {
}
}
var gaussGray = (psrc: Array<number>, horz: number, vert: number,
let gaussGray = (psrc: Array<number>, horz: number, vert: number,
width: number, height: number): number => {
let dst, src, n_p, n_m, d_p, d_m, bd_p, bd_m, val_p, val_m, initial_p, initial_m: Array<number>;
let i, j, t, k, row, col, terms, std_dev, sp_p_idx, sp_m_idx, vp_idx, vm_idx: number;
let dst: Array<number>;
let src: Array<number>;
let n_p: Array<number>;
let n_m: Array<number>;
let d_p: Array<number>;
let d_m: Array<number>;
let bd_p: Array<number>;
let bd_m: Array<number>;
let val_p: Array<number>;
let val_m: Array<number>;
let initial_p: Array<number>;
let initial_m: Array<number>;
let i: number;
let j: number;
let t: number;
let k: number;
let row: number;
let col: number;
let terms: number;
let std_dev: number;
let sp_p_idx: number;
let sp_m_idx: number;
let vp_idx: number;
let vm_idx: number;
let row_stride = width;
let max_len = Math.max(width, height);
val_p = createIntArray(max_len);
@ -205,7 +231,7 @@ export namespace CalculatePixelUtils {
return 0;
}
var findConstants = (n_p: Array<number>, n_m: Array<number>, d_p: Array<number>,
let findConstants = (n_p: Array<number>, n_m: Array<number>, d_p: Array<number>,
d_m: Array<number>, bd_p: Array<number>
, bd_m: Array<number>, std_dev: number) => {
let div = Math.sqrt(2 * 3.141593) * std_dev;
@ -217,7 +243,7 @@ export namespace CalculatePixelUtils {
let x5 = 3.735 / div;
let x6 = -0.6803 / div;
let x7 = -0.2598 / div;
let i;
let i: number;
n_p[0] = x4 + x6;
n_p[1] = (Math.exp(x1)
* (x7 * Math.sin(x3) - (x6 + 2 * x4) * Math.cos(x3)) + Math
@ -247,7 +273,11 @@ export namespace CalculatePixelUtils {
for (i = 1; i <= 4; i++) {
n_m[i] = n_p[i] - d_p[i] * n_p[0];
}
let sum_n_p, sum_n_m, sum_d, a, b: number;
let sum_n_p: number;
let sum_n_m: number;
let sum_d: number;
let a: number;
let b: number;
sum_n_p = 0.0;
sum_n_m = 0.0;
sum_d = 0.0;
@ -264,9 +294,13 @@ export namespace CalculatePixelUtils {
}
}
var transferGaussPixels = (src1: Array<number>, src2: Array<number>,
let transferGaussPixels = (src1: Array<number>, src2: Array<number>,
dest: Array<number>, bytes: number, width: number) => {
let i, j, k, b, sum: number;
let i: number;
let j: number;
let k: number;
let b: number;
let sum: number;
let bend = bytes * width;
i = j = k = 0;
for (b = 0; b < bend; b++) {
@ -281,7 +315,7 @@ export namespace CalculatePixelUtils {
export function createIntArray(len: number): Array<number> {
let array = new Array<number>();
for (var index = 0; index < len; index++) {
for (let index = 0; index < len; index++) {
array.push(0);
}
return array;
@ -300,8 +334,8 @@ export namespace CalculatePixelUtils {
}
export async function sketchGpu(p: PixelMap, func?: AsyncTransform<PixelMap>) {
let imageInfo:image.ImageInfo = await p.getImageInfo();
let size = {
let imageInfo: image.ImageInfo = await p.getImageInfo();
let size:Size = {
width: imageInfo.size.width,
height: imageInfo.size.height
}
@ -319,7 +353,7 @@ export namespace CalculatePixelUtils {
filter.setImageData(bufferData, w, h);
filter.getPixelMapBuf(0, 0, w, h).then((buf) => {
p.writeBufferToPixels(buf);
if (func!=undefined) {
if (func != undefined) {
func.asyncTransform("success", p);
}
})

View File

@ -14,7 +14,7 @@
*/
import resourceManager from '@ohos.resourceManager';
import { ImageKnifeGlobal } from '../ImageKnifeGlobal';
import type {DataCallBack} from "../interface/DataCallBack"
import {DataCallBack} from "../interface/DataCallBack"
export namespace ColorUtils {
@ -24,11 +24,11 @@ export namespace ColorUtils {
*/
export function parseColor(c: string, callback: DataCallBack<string>) {
var reColor = 'sys.color.' + c;
let reColor = 'sys.color.' + c;
((ImageKnifeGlobal.getInstance().getHapContext() as Record<string,Object>).resourceManager as resourceManager.ResourceManager).getString($r(reColor)
.id, (err, color) => {
if (!err) {
var cos = JSON.stringify(color);
let cos = JSON.stringify(color);
callback.callback(cos)
} else {
callback.callback(err.message)

View File

@ -14,8 +14,8 @@
*/
import {LogUtil} from '../../imageknife/utils/LogUtil'
export class FileTypeUtil {
private map = new Map();
private READ_MIN_LENGTH;
private map:Map<string,string> = new Map<string,string>();
private READ_MIN_LENGTH:number = 0;
private SUPPORT_FORMATS = [
PhotoFormat.jpg,
PhotoFormat.png,
@ -45,11 +45,14 @@ export class FileTypeUtil {
let dataView = new DataView(arraybuffer);
LogUtil.log('dataView +'+this.getDataViewAt(dataView,0)+this.getDataViewAt(dataView,1))
for(var [key,value] of this.map){
let entries: IterableIterator<Object[]> = this.map.entries();
for (let i = 0; i < this.map.size; i++) {
let entry:Object[] = entries.next().value;
let key = entry[0] as string
let value = entry[1] as string
let keySplit = key.split(',')
if(keySplit.length == 2){
let offset = parseInt(keySplit[0])
let offset = Number(keySplit[0])
let magicStringLength = keySplit[1].length;
let readLength = magicStringLength/2;
let start = 0;
@ -58,8 +61,6 @@ export class FileTypeUtil {
fileMagic+=this.getDataViewAt(dataView,offset+start)
start++;
}
// LogUtil.log('magic='+fileMagic+' keySplit[1]='+keySplit[1]+' fileMagic == keySplit[1] ='+(fileMagic == keySplit[1])+
// ' fileMagic type ='+typeof(fileMagic) + ' keySplit[1]='+typeof(keySplit[1]))
if(fileMagic == keySplit[1]){
LogUtil.log('匹配到了 fileType='+value)
fileType = value
@ -104,9 +105,14 @@ export class FileTypeUtil {
}
private printMapContent(){
for(var [key,value] of this.map){
let entries: IterableIterator<Object[]> = this.map.entries();
for (let i = 0; i < this.map.size; i++) {
let entry:Object[] = entries.next().value;
let key = entry[0] as string
let value = entry[1] as string
LogUtil.log('key='+key+'---value='+value)
}
}
}
private initReadMinLength(){
@ -114,7 +120,7 @@ export class FileTypeUtil {
this.map.forEach((value,key,map)=>{
let keySplit = key.split(',');
if(keySplit.length == 2){
let offset = parseInt(keySplit[0])
let offset = Number(keySplit[0])
let magicStringLength = keySplit[1].length;
let tempMax = offset + magicStringLength/2;
if(tempMax > max){

View File

@ -31,7 +31,7 @@ export class K2DArray {
if (row < 1) {
return;
}
for (var i = 0; i < row; i++) {
for (let i = 0; i < row; i++) {
this._2dArray.push(new Array<number>())
}
}
@ -40,8 +40,8 @@ export class K2DArray {
if (c < 1) {
return;
}
for (var i = 0; i < this._2dArray.length; i++) {
for (var j = 0; j < c; j++) {
for (let i = 0; i < this._2dArray.length; i++) {
for (let j = 0; j < c; j++) {
this._2dArray[i].push(value);
}
}
@ -57,7 +57,7 @@ export class K2DArray {
/**
* 获取数组
*/
public getColumnsArray(r: number): Array<number>{
public getColumnsArray(r: number): Array<number>|null{
if (r < 0 || r >= this.rows) {
return null;
}

View File

@ -22,32 +22,32 @@ export class LogUtil {
public static ALL: number = 7
public static mLogLevel:number = LogUtil.OFF;
public static debug(message: string, ...args: any[]) {
public static debug(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.DEBUG) {
console.debug(message, args)
}
}
public static info(message: string, ...args: any[]) {
public static info(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.INFO) {
console.info(message, args)
}
}
public static log(message: string, ...args: any[]) {
public static log(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.LOG) {
console.log(message, args)
}
}
public static warn(message: string, ...args: any[]) {
public static warn(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.WARN) {
console.warn(message, args)
}
}
// error 不做拦截
public static error(message: string, ...args: any[]) {
public static error(message: string, ...args: Object[]) {
if(LogUtil.mLogLevel >= LogUtil.ERROR) {
console.error(message, args)
}

View File

@ -16,11 +16,12 @@ import {PixelEntry} from "../entry/PixelEntry"
import {AsyncTransform} from "../transform/AsyncTransform"
import {ColorUtils} from "./ColorUtils"
import {CalculatePixelUtils} from "./CalculatePixelUtils"
import {Size} from '../RequestOption'
export class MaskUtils {
static async mask(bitmap: any, maskBitmap: any, func?: AsyncTransform<PixelMap>) {
static async mask(bitmap: PixelMap, maskBitmap: PixelMap, func?: AsyncTransform<PixelMap>) {
let imageInfo = await bitmap.getImageInfo();
let size = {
let size:Size = {
width: imageInfo.size.width,
height: imageInfo.size.height
}
@ -62,7 +63,7 @@ export class MaskUtils {
let imageInfoMask = await maskBitmap.getImageInfo();
let sizeMask = {
let sizeMask:Size = {
width: imageInfoMask.size.width,
height: imageInfoMask.size.height
}
@ -137,8 +138,8 @@ export class MaskUtils {
index++;
}
await maskBitmap.writeBufferToPixels(bufferNewData);
if (func) {
func("", maskBitmap);
if (func != undefined) {
func?.asyncTransform("", maskBitmap);
}
}
}

View File

@ -31,9 +31,9 @@ export class ParseImageUtil implements IParseImage<PixelMap> {
}
let hValue = Math.round(value.size.height * scale);
let wValue = Math.round(value.size.width * scale);
let defaultSize = {
'height': hValue,
'width': wValue
let defaultSize:image.Size = {
height: hValue,
width: wValue
};
let opts:image.DecodingOptions = {

View File

@ -37,7 +37,7 @@ export namespace pixelUtils {
let targetWidth:number = size.width;
let targetHeight:number = size.height;
var pixEntry: Array<PixelEntry> = new Array()
let pixEntry: Array<PixelEntry> = new Array()
let inPixels: Array<Array<number>> = CalculatePixelUtils.createInt2DArray(targetHeight, targetWidth);
let bufferData = new ArrayBuffer(bitmap.getPixelBytesNumber());
@ -71,13 +71,13 @@ export namespace pixelUtils {
}
}
var realPixel_W = pixel > targetWidth ? targetWidth : pixel;
var realPixel_H = pixel > targetHeight ? targetHeight : pixel;
let realPixel_W = pixel > targetWidth ? targetWidth : pixel;
let realPixel_H = pixel > targetHeight ? targetHeight : pixel;
//横排的正方形个数
var x_index = Math.floor(targetWidth / realPixel_W);
let x_index = Math.floor(targetWidth / realPixel_W);
//纵排的正方形个数
var y_index = Math.floor(targetHeight / realPixel_H);
let y_index = Math.floor(targetHeight / realPixel_H);
for (let ch = 0; ch < y_index; ch++) {
for (let cw = 0; cw < x_index; cw++) {
@ -132,9 +132,9 @@ export namespace pixelUtils {
func?.asyncTransform("success", bitmap);
}
}
export async function pixelGPU(bitmap: any, pixel: number, func?: AsyncTransform<PixelMap>) {
export async function pixelGPU(bitmap: PixelMap, pixel: number, func?: AsyncTransform<PixelMap>) {
let imageInfo = await bitmap.getImageInfo();
let imageInfo:image.ImageInfo = await bitmap.getImageInfo();
let size:Size = {
width: imageInfo.size.width,
height: imageInfo.size.height

View File

@ -12,15 +12,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import image from '@ohos.multimedia.image';
export interface Dims{
width: number;
height: number;
top: number;
left: number
}
export class GIFFrame {
// 显示帧 width 宽 height 高 top上边距 left左边距
dims: {
width: number;
height: number;
top: number;
left: number
}
dims: Dims
// 当前帧的像素数据指向的颜色数组 只为了生成patch,非必要
colorTable?: [number, number, number][]
@ -35,7 +37,7 @@ export class GIFFrame {
patch?: Uint8ClampedArray
// drawPixelMap 如果像素转换为PixelMap后使用PixelMap展示 patch和drawPixelMap 2选1
drawPixelMap?
drawPixelMap?:image.PixelMap
// 当前帧每个像素的颜色表查找索引 只为了生成patch,非必要
pixels?: number[]

View File

@ -13,21 +13,33 @@
* limitations under the License.
*/
import type { IParseGif } from './IParseGif'
import { GIFFrame } from './GIFFrame'
import { Dims, GIFFrame } from './GIFFrame'
import { LoadType } from '../../../../../../../GifWorker'
import { parseBufferToFrame } from './parse/GIFParse'
import { LogUtil } from '../../utils/LogUtil'
import image from '@ohos.multimedia.image'
import { ImageKnifeGlobal } from '../../ImageKnifeGlobal'
import { BusinessError } from '@ohos.base'
import worker from '@ohos.worker';
import worker, { ErrorEvent, MessageEvents } from '@ohos.worker';
export interface senderData{
type:string,
data:ArrayBuffer;
}
export interface gifBackData{
dims:Dims[],
delay:number[],
disposalType:number[],
patch:Uint8ClampedArray[],
transparentIndex:number[]
}
export class GIFParseImpl implements IParseGif {
parseGifs(imageinfo: ArrayBuffer, callback: (data?:GIFFrame[], err?:BusinessError|string) => void, worker?:worker.ThreadWorker,runMainThread?:boolean) {
let resolveWorker = worker;
LogUtil.log('parseGifs resolveWorker1 is null =' + (resolveWorker == null))
if (!resolveWorker) {
resolveWorker = ImageKnifeGlobal.getInstance().getImageKnife().getGifWorker();
if (!resolveWorker && ImageKnifeGlobal.getInstance().getImageKnife() != undefined) {
resolveWorker = ImageKnifeGlobal.getInstance().getImageKnife()?.getGifWorker();
}
LogUtil.log('parseGifs resolveWorker2 is null =' + (resolveWorker == null))
@ -38,18 +50,22 @@ export class GIFParseImpl implements IParseGif {
if (err) {
callback(undefined, err)
} else {
this.createPixelMapAll(data).then((pixelmaps) => {
if (pixelmaps.length == data.length) {
for (let i = 0;i < data.length; i++) {
let frame = data[i];
frame['drawPixelMap'] = pixelmaps[i];
frame['patch'] = null;
if (data != undefined) {
this.createPixelMapAll(data).then((pixelmaps) => {
if (pixelmaps.length == data.length) {
for (let i = 0;i < data.length; i++) {
let frame = data[i];
frame['drawPixelMap'] = pixelmaps[i];
frame['patch'] = undefined;
}
callback(data, undefined)
}
callback(data, undefined)
}
}).catch(err => {
callback(undefined, err)
})
}).catch((err: BusinessError) => {
callback(undefined, err)
})
}else{
callback(undefined, 'GIF Parse Error callback data is undefined')
}
}
})
} else {
@ -61,55 +77,58 @@ export class GIFParseImpl implements IParseGif {
for (let i = 0;i < frames.length; i++) {
let frame = frames[i];
frame['drawPixelMap'] = pixelmaps[i];
frame['patch'] = null;
frame['patch'] = undefined;
}
LogUtil.log('parseGifs in main thread! callback is done!')
callback(frames, undefined)
}
}).catch(err => {
}).catch((err:BusinessError) => {
LogUtil.log('parseGifs in main thread! err =' + err)
callback(undefined, err)
})
}
}
private createPixelMapAll(frames): Promise<PixelMap[]> {
let promises = []
let filterCriteria = (item) => {
private createPixelMapAll(frames:GIFFrame[]): Promise<PixelMap[]> {
let promises:Promise<PixelMap>[] = new Array();
let filterCriteria = (item:GIFFrame) => {
if (!item['drawPixelMap']) {
return true;
}
return false;
}
frames.filter(filterCriteria, frames).flatMap((frame) => {
promises.push(image.createPixelMap(frame.patch.buffer, {
'size': {
'height': frame.dims.height as number,
'width': frame.dims.width as number
}
}))
frames.filter(filterCriteria, frames).flatMap<void,undefined>((frame:GIFFrame) => {
if(frame.patch != undefined) {
promises.push(image.createPixelMap(frame.patch.buffer, {
'size': {
'height': frame.dims.height as number,
'width': frame.dims.width as number
}
}))
}
})
return Promise.all(promises)
return Promise.all<PixelMap>(promises)
}
private useWorkerParse(worker: any, buffer: ArrayBuffer, callback: (data?, err?) => void) {
private useWorkerParse(worker:worker.ThreadWorker, buffer: ArrayBuffer, callback: (data?:GIFFrame[], err?:BusinessError|string) => void) {
worker.onerror = function (data) {
callback(undefined, data)
worker.onerror = (err:ErrorEvent)=>{
callback(undefined, err)
}
worker.onmessageerror = function (event) {
worker.onmessageerror = (event: MessageEvents) => {
callback(undefined, event)
}
worker.onexit = function () {
worker.onexit = ()=> {
LogUtil.log('gifWork worker.onexit!')
}
worker.onmessage = (e) => {
var data = e.data;
switch (data.type) {
worker.onmessage = (e: MessageEvents) => {
let data:Record<string,Object> = e.data;
switch (data.type as string) {
case LoadType.loadBufferByWorker:
let pages = data.data;
let pages:gifBackData = (data.data as gifBackData);
if (this.gifDecodeCorrect(pages)) {
let images = this.recDecodedData(pages);
callback(images, undefined)
@ -122,12 +141,12 @@ export class GIFParseImpl implements IParseGif {
}
}
var obj = { type: LoadType.loadBufferByWorker, data: buffer }
let obj:senderData = { type: LoadType.loadBufferByWorker, data: buffer }
worker.postMessage(obj, [buffer])
}
private gifDecodeCorrect(frames) {
private gifDecodeCorrect(frames:gifBackData) {
if (
(frames.patch.length == frames.dims.length) &&
(frames.patch.length == frames.delay.length) &&
@ -141,24 +160,19 @@ export class GIFParseImpl implements IParseGif {
}
// 子线程数据回传处理
private recDecodedData(pages): GIFFrame[] {
let images = []
private recDecodedData(pages:gifBackData): GIFFrame[] {
let images:GIFFrame[] = new Array()
for (let i = 0; i < pages.patch.length; i++) {
let frame = {}
let frame = new GIFFrame();
frame['dims'] = pages.dims[i]
pages.dims[i] = null
frame['delay'] = pages.delay[i]
pages.delay[i] = null
frame['disposalType'] = pages.disposalType[i]
pages.disposalType[i] = null
let uint8ClampedArray = new Uint8ClampedArray(pages.patch[i])
frame['patch'] = uint8ClampedArray
pages.patch[i] = null
pages[i] = new Uint8ClampedArray(0)
frame['transparentIndex'] = pages.transparentIndex[i]
pages.transparentIndex[i] = null
images.push(frame)
}
pages = null
return images;
}
}

View File

@ -12,7 +12,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {Size} from '../../RequestOption'
export interface IParseSvg {
// 解析svg
parseSvg(imageinfo: ArrayBuffer,size?:{width:number,height:number}): Promise<PixelMap>
parseSvg:(imageinfo: ArrayBuffer,size?:Size)=> Promise<PixelMap>
}