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

时间:2016-10-18 18:54:49

标签: javascript node.js flash

我创建了一个库,用于从 SWF 文件中提取图像二进制.bin)数据。

但是对于DefineBitsLossless2代码(PNG带有alpha的图片),我遇到了一个问题:有些像素不在正确的位置,但其他像素 OK

这是我当前使用Jimp库进行图像处理的代码(用Typescript编写)(我也试过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]);
}

这是我用于测试目的的this SWF的结果:

使用我的

#1

使用 FFDec (Java中的免费Flash反编译器)

#2

我关注this Adobe guide来制作我的图书馆(请参阅144页面DefineBitsLossless2标记)

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

我相信:

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

应改为:

var GZBuffer = zlib.unzipSync(data);

不确定您使用concatSWFHeader的目的是什么,但它更适合您添加的ZLIB标题的一部分,它应该考虑整个图像偏移2个像素。