【发布时间】:2021-01-13 07:51:15
【问题描述】:
我遇到了一个相当严重的问题。我正在将 Flash 重写为 JS,并遇到了 SOAP 返回数据处理的问题。它是关于我以字符串形式获取的图像,然后将其转换为 Flash 中使用的 BitmapData。 我尝试了许多不同的方法,但充其量它会在画布上得到一个带有噪点的绿色图像。以下是您可能会发现有用的所有代码 sn-ps
来自 Flash 的代码:
private function encode(bitmap:Bitmap):ByteArray{
var encoder:JPGEncoder = new JPGEncoder(QUALITY);
return encoder.encode(bitmap.bitmapData);
}
public function decodeBytes(bm:Bitmap):void{
_bitmap = bm;
_bytesData = encode(_bitmap);
var imgConventer:ArrayDataConventer = new ArrayDataConventer();
imgConventer.addEventListener(ImageConvertCompleteEvent.IMAGE_CONVERT_COMPLETE, convertCompleteHandler);
imgConventer.decByteArrToHexStr(bytesData);
}
decByteArrToHexStr 返回字符串,其中两个十六进制字符表示字节。这个字符串被推送到 SOAP 并在我想要获取它时返回。所以这是 Flash 部分。
现在我想将此字符串转换为可以放入画布的图像数据。
我有将字符串转换为 Uint8Array 的方法。
public hexStrToDecByteArr(str: string): Uint8Array {
const byteArr: Uint8Array = new Uint8Array(str.length / 2);
for (let i: number = 0; i < str.length; i = i + 2) {
const n: number = parseInt('0x' + str.substr(i, 2), 0);
if (!isNaN(n)) {
byteArr[i] = n;
}
}
return data;
}
然后在响应处理程序中我有这样的东西:
const decodes: ArrayDataConverter = new ArrayDataConverter();
const data = decodes.hexStrToDecByteArr(downloadedImage.sData);
const encoder: any = new JPGEncoder(100);
const encoded = encoder.encode({width: 400, height: 300, data});
const context = this.canvas.nativeElement.getContext('2d');
context.clearRect(0, 0, 400, 300);
const image = new Image();
image.onload = () => {
context.drawImage(image, 0, 0);
};
image.src = encoded;
所以下载的Image.sData 包含十六进制字符串。 JPGEncoder 是我找到的包,它是 JPGEncoder Flash 版本重写为 JS (https://www.npmjs.com/package/@koba04/jpeg-encoder)。
正如我之前提到的,我在画布上得到了带有一些噪点的绿色图像。
提前致谢。
【问题讨论】:
标签: typescript image actionscript-3 flash jpeg