我试着:
- 通过 FileReference 加载 jpeg
- 将结果写入字节数组
- 直接从字节数组中提取像素数据(仅此而已)
我花了很多时间寻找可以从原始二进制数据(例如从字节数组)解码 jpeg 对象的 AS3 类,但无济于事(这里有一个,但它依赖于 Alchemy 和一个 SWC,它不是适合)。
简而言之,一旦我在字节数组中获得了原始数据,我就想知道如何从文件的其余部分中辨别出像素数据。
我对使用 Loader 类或 Bitmap 的“getPixels”函数不感兴趣。
我试着:
我花了很多时间寻找可以从原始二进制数据(例如从字节数组)解码 jpeg 对象的 AS3 类,但无济于事(这里有一个,但它依赖于 Alchemy 和一个 SWC,它不是适合)。
简而言之,一旦我在字节数组中获得了原始数据,我就想知道如何从文件的其余部分中辨别出像素数据。
我对使用 Loader 类或 Bitmap 的“getPixels”函数不感兴趣。
您会注意到隐写术依赖于使用 png 文件。您不能(轻松)使用 jpg 文件的原因是编码过程消除了像素数据的可靠性。Jpg 文件可以以多种方式编码,包括 CMYK 和 RGB,但最常见的是 YCbCr。JPG 压缩依赖于傅里叶变换,这将消除像素级细节。因此,您将无法对 jpg 和 png、gif、bmp 等使用相同的处理。
这并不是说您不能在 jpg 文件中执行此操作,而是您需要更改方法,或考虑压缩阶段的数据丢失(或保存未压缩)。
好吧,您可以直接操作压缩数据以包含您的消息,但您必须阅读如何在不完全破坏图像的情况下做到这一点。
但是,如果您想在解码消息时对像素中的消息进行编码以进行逐像素差异,恐怕您的假设(来自对 Daniel 答案的评论)是错误的。
JPEG 压缩是有损的 - 这意味着当您将修改后的像素数据放回图像文件时,这将导致所有像素数据丢失(因为它需要重新编码。)保存的唯一信息不是像素数据文件中的内容是如何重新组合一张看起来与人眼看起来非常相似的图像,但像素数据并不相同。
即使您对图像进行解码,然后将其保存为 JPEG 文件,然后对原始图像进行转换,最后将其保存为具有完全相同压缩设置的第二个 JPEG,您也不能依赖每个像素的比较。
但是,我似乎记得 JPEG 将图像数据压缩为 8*8 像素块,您也许可以按块操作和比较图像数据。
直接从字节数组中提取像素数据(仅此而已)
为此,您需要先对 jpeg 进行解码(除了一些最终的元数据,典型 jpeg 文件中除了像素数据之外别无其他),而做到这一点的方法就是使用 Loader.loadBytes,然后使用 BitmapData.getPixels。您可能可以制作自己的解码器(就像您发布的那样),但我认为这样做没有任何好处。
ByteArray.org 的一个名叫 Thibault Imbert 的人为 ActionScript 3 改编了 libjpeg 库。我没有对此进行测试,但其他人似乎喜欢 bytearray.org 上的评论。