From 8f679a2293717e48f0686003d850be2e312d034a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=8E=E6=9C=88=E6=B8=85=E9=A3=8E?= <2928139825@qq.com> Date: Tue, 14 Nov 2023 10:21:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E=EF=BC=9A?= =?UTF-8?q?=20-=20gif=E8=A7=A3=E7=A0=81=E6=94=B9=E4=B8=BAimageSource?= =?UTF-8?q?=E8=A7=A3=E7=A0=81,=E4=B8=8D=E5=9C=A8=E5=AF=B9worker=E5=BC=BA?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=20-=20=E4=B8=8B=E8=BD=BD=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BAhttp.requestInStream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 明月清风 <2928139825@qq.com> --- CHANGELOG.md | 5 + imageknife/oh-package.json5 | 2 +- .../networkmanage/DownloadClient.ets | 3 +- .../imageknife/utils/gif/GIFParseImpl.ets | 170 ++++-------------- 4 files changed, 44 insertions(+), 136 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae32f59..b10d543 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.1.1-rc.2 + +- gif解码改为imageSource解码,不在对worker强依赖 +- 下载接口修改为http.requestInStream + ## 2.1.1-rc.1 - 新增自定义key参数配置 diff --git a/imageknife/oh-package.json5 b/imageknife/oh-package.json5 index 35048fb..3abed28 100644 --- a/imageknife/oh-package.json5 +++ b/imageknife/oh-package.json5 @@ -14,7 +14,7 @@ "main": "index.ets", "repository": "https://gitee.com/openharmony-tpc/ImageKnife", "type": "module", - "version": "2.1.1-rc.1", + "version": "2.1.1-rc.2", "dependencies": { "@ohos/disklrucache": "^2.0.2-rc.0", "@ohos/svg": "^2.1.1-rc.0", diff --git a/imageknife/src/main/ets/components/imageknife/networkmanage/DownloadClient.ets b/imageknife/src/main/ets/components/imageknife/networkmanage/DownloadClient.ets index 114216e..089121a 100644 --- a/imageknife/src/main/ets/components/imageknife/networkmanage/DownloadClient.ets +++ b/imageknife/src/main/ets/components/imageknife/networkmanage/DownloadClient.ets @@ -44,7 +44,8 @@ export class DownloadClient implements IDataFetch { this.dataShareFileClient.loadData(request, onCompleteFunction, onErrorFunction) } else { // 网络下载 - this.networkDownloadClient.loadData(request, onCompleteFunction, onErrorFunction) + // this.networkDownloadClient.loadData(request, onCompleteFunction, onErrorFunction) + this.httpDownloadClient.loadData(request, onCompleteFunction, onErrorFunction) } } } diff --git a/imageknife/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets b/imageknife/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets index 9cd5390..6f2e5d8 100644 --- a/imageknife/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets +++ b/imageknife/src/main/ets/components/imageknife/utils/gif/GIFParseImpl.ets @@ -14,11 +14,7 @@ */ import { IParseGif } from './IParseGif' 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, { ErrorEvent, MessageEvents } from '@ohos.worker'; @@ -35,143 +31,49 @@ export interface gifBackData{ 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 && ImageKnifeGlobal.getInstance().getImageKnife() != undefined) { - resolveWorker = ImageKnifeGlobal.getInstance().getImageKnife()?.getGifWorker(); + // 硬解码流程 + let imageSource = image.createImageSource(imageinfo); + let decodeOpts: image.DecodingOptions = { + sampleSize: 1, + editable: true, + rotate: 0 } - LogUtil.log('parseGifs resolveWorker2 is null =' + (resolveWorker == null)) - - if (!!resolveWorker && !runMainThread) { - LogUtil.log('parseGifs in worker thread!') - let copyBuffer = imageinfo.slice(0); - this.useWorkerParse(resolveWorker, copyBuffer, (data, err) => { - if (err) { - callback(undefined, err) - } else { - 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) + let data:GIFFrame[] = []; + imageSource.createPixelMapList(decodeOpts).then((pixelList: Array) => { + //sdk的api接口发生变更:从.getDelayTime() 变为.getDelayTimeList() + imageSource.getDelayTimeList().then(delayTimes => { + if (pixelList.length > 0) { + let pixelmap1 = pixelList[0]; + pixelmap1.getImageInfo().then(imageInfo => { + for (let i = 0; i < pixelList.length; i++) { + let frame = new GIFFrame(); + frame.drawPixelMap = pixelList[i]; + frame.dims = { width: imageInfo.size.width, height: imageInfo.size.height, top: 0, left: 0 } + if (i < delayTimes.length) { + frame.delay = delayTimes[i]; + } else { + frame.delay = delayTimes[delayTimes.length - 1] } - }).catch((err: BusinessError) => { - callback(undefined, err) - }) - }else{ - callback(undefined, 'GIF Parse Error callback data is undefined') - } + data.push(frame) + } + callback(data,undefined) + imageSource.release(); + }).catch((err: string) => { + imageSource.release(); + callback(undefined,err) + }) } + }).catch((err: string) => { + imageSource.release(); + callback(undefined,err) }) - } else { - LogUtil.log('parseGifs in main thread!') - let frames = parseBufferToFrame(imageinfo) - LogUtil.log('frames length =' + frames.length) - this.createPixelMapAll(frames).then((pixelmaps) => { - if (pixelmaps.length == frames.length) { - for (let i = 0;i < frames.length; i++) { - let frame = frames[i]; - frame['drawPixelMap'] = pixelmaps[i]; - frame['patch'] = undefined; - } - LogUtil.log('parseGifs in main thread! callback is done!') - callback(frames, undefined) - } - }).catch((err:BusinessError) => { - LogUtil.log('parseGifs in main thread! err =' + err) - callback(undefined, err) - }) - } - } - - private createPixelMapAll(frames:GIFFrame[]): Promise { - let promises:Promise[] = new Array(); - let filterCriteria = (item:GIFFrame) => { - if (!item['drawPixelMap']) { - return true; - } - return false; - } - frames.filter(filterCriteria, frames).flatMap((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 - } - })) - } + }).catch((err: string) => { + imageSource.release(); + callback(undefined,err) }) - return Promise.all(promises) - } - - private useWorkerParse(worker:worker.ThreadWorker, buffer: ArrayBuffer, callback: (data?:GIFFrame[], err?:BusinessError|string) => void) { - - worker.onerror = (err:ErrorEvent)=>{ - callback(undefined, err.message) - } - - worker.onmessageerror = (event: MessageEvents) => { - callback(undefined, event.type) - } - - worker.onexit = ()=> { - LogUtil.log('gifWork worker.onexit!') - } - - worker.onmessage = (e: MessageEvents) => { - let data:Record = e.data; - switch (data.type as string) { - case LoadType.loadBufferByWorker: - let pages:gifBackData = (data.data as gifBackData); - if (this.gifDecodeCorrect(pages)) { - let images = this.recDecodedData(pages); - callback(images, undefined) - } else { - callback(undefined, 'GIF Worker Decoder Data Is Error!') - } - break; - default: - break - } - } - - let obj:senderData = { type: LoadType.loadBufferByWorker, data: buffer } - worker.postMessage(obj, [buffer]) } - private gifDecodeCorrect(frames:gifBackData) { - if ( - (frames.patch.length == frames.dims.length) && - (frames.patch.length == frames.delay.length) && - (frames.patch.length == frames.disposalType.length) && - (frames.patch.length == frames.patch.length) && - (frames.patch.length == frames.transparentIndex.length) - ) { - return true; - } - return false; - } - - // 子线程数据回传处理 - private recDecodedData(pages:gifBackData): GIFFrame[] { - let images:GIFFrame[] = new Array() - for (let i = 0; i < pages.patch.length; i++) { - let frame = new GIFFrame(); - frame['dims'] = pages.dims[i] - frame['delay'] = pages.delay[i] - frame['disposalType'] = pages.disposalType[i] - let uint8ClampedArray = new Uint8ClampedArray(pages.patch[i]) - frame['patch'] = uint8ClampedArray - frame['transparentIndex'] = pages.transparentIndex[i] - images.push(frame) - } - return images; - } } \ No newline at end of file