node.js swf提取definebitslossless2不正确的像素

我制作了一个库来从SWF文件中提取图像二进制.bin )数据。

但是对于DefineBitsLossless2标签(带有alpha的PNG图像),我有一个问题:有些像素不在正确的位置,但是其他的都可以

这是我目前的代码(用Typescript编写)使用Jimp库进行image processing(我也试过node-canvas ,同样的事情)

 private async DefineBitsLossless2(buff: SWFBuffer, tag: any, tagHeader: any, Callback: Function) { var id = buff.readUIntLE(16); var format = buff.readUInt8(); var width = buff.readUIntLE(16); var height = buff.readUIntLE(16); var data = buff.buffer.slice(buff.pointer, (buff.pointer + tagHeader.length) - 7); buff.addPointer(tagHeader.length - 7); if(format != 5) { throw new Error(`Unsupported DefineBitsLossless2 image format. Only format 5 is supported, got format ${format}`); } var GZBuffer = this.concatSWFHeader(zlib.unzipSync(data), data); var image = await new Jimp(width, height); var position = 0; for(var y = 0; y < height; y++) { for(var x = 0; x < width; x++) { var alpha = GZBuffer.readUInt8(position++); var red = GZBuffer.readUInt8(position++); var green = GZBuffer.readUInt8(position++); var blue = GZBuffer.readUInt8(position++); image.setPixelColor(Jimp.rgbaToInt(red, green, blue, alpha), x, y); } } image.getBuffer(Jimp.MIME_PNG, function(err, buffer) { tag.id = id; tag.format = format; tag.width = width; tag.height = height; tag.data = buffer; Callback(null); }); } private concatSWFHeader(buff: Buffer, swf: Buffer) { return Buffer.concat([swf.slice(0, 8), buff]); } 

这是我用于testingpruposes 这个SWF的结果:

使用我的图书馆

#1

使用FFDec (Java中的Free Flash Decompiler)

#2

我遵循这个Adobe 指南来制作我的库(参见144页的DefineBitsLossless2标签)

我的代码有什么问题?

我相信这一点:

 var GZBuffer = this.concatSWFHeader(zlib.unzipSync(data), data); 

应该是:

 var GZBuffer = zlib.unzipSync(data); 

不知道你要用concatSWFHeader ,但是这是你添加的ZLIB头文件的一部分,它应该占整个图像偏移2个像素。