如何在Actionscript 3中直接访问bytearray的jpeg像素

时间:2013-02-07 17:25:06

标签: actionscript-3 actionscript jpeg

我正在努力:

  • 通过FileReference
  • 加载jpeg
  • 将结果写入bytearray
  • 直接从bytearray
  • 中提取像素数据(没有别的)

我花了很多时间寻找可以从原始二进制数据(例如来自bytearray)解码jpeg对象的AS3类,但无济于事(有一个here但它依赖于Alchemy和SWC,这是不合适的。)

简单地说,一旦我在字节数组中有原始数据,我想知道如何从文件的其余部分中识别像素数据。

我对使用Loader类或Bitmap的'getPixels'函数不感兴趣。

4 个答案:

答案 0 :(得分:3)

您会注意到隐写术依赖于使用png文件。你不能轻易使用jpg文件的原因是编码过程消除了像素数据的可靠性。 Jpg文件可以用多种方式编码,包括CMYK和RGB,但最常见的是YCbCr。 Jpg压缩依赖于傅立叶变换,这将消除像素级细节。因此,您将无法在jpg和png,gif,bmp等上使用相同的过程。

这并不是说您不能在jpg文件中执行此操作,但您需要更改方法,或者在压缩阶段考虑数据丢失(或保存未压缩的数据)。

答案 1 :(得分:2)

好吧,你可以直接操作压缩数据来包含你的信息,但是你必须要了解你如何能够完全无法完成破坏图像。

但是如果你想在解码你的消息时在像素中对消息进行编码以执行每像素差异,我担心你的假设(来自对Daniel的回答的评论)是错误的。

JPEG压缩是有损的 - 这意味着当你将修正后的像素数据放回到图像文件中时会导致所有像素数据丢失(因为它需要重新编码)。而不是像素数据保存在文件中的信息是如何重新组合出与人眼原始图像非常相似的图像,但像素数据不一样。

即使您解码图像,然后将其保存为JPEG文件,然后进行原始图像的转换,最后将其保存为第二个JPEG,并使用完全相同的压缩设置,您可以依赖于每个像素的比较。

然而,由于我似乎记得JPEG压缩8 * 8像素块中的图像数据,您可能能够以每个块为基础操作和比较图像数据。

答案 2 :(得分:1)

  

直接从bytearray

中提取像素数据(没有别的)

要做到这一点,你需要首先解码jpeg(除了一些最终的元数据,除了典型的jpeg文件中的像素数据之外别无其他),并且这样做的方法正是使用Loader.loadBytes然后是BitmapData。的getPixels。您可以制作自己的解码器(就像您发布的解码器一样),但我认为没有任何好处。

答案 3 :(得分:1)

ByteArray.org上一个名叫Thibault Imbert的人改编了ActionScript 3的libjpeg库。我没有测试过这个,但其他人似乎喜欢它在bytearray.org上的评论。

http://code.google.com/p/as3-jpeg-decoder/downloads/list