2016-02-28 89 views
-1

我试图执行隐写术具有以下步骤: 1.转换后的图像,以缓冲的图像 2.转换缓冲的图像,以字节阵列 3.所做的修改在字节数组 4.转换字节数组回缓冲的图像 5.保存为jpg文件转换字节数组图像并返回到字节数组,值改变

当我再次读取所保存的文件中的问题出现了,它转换成字节数组,发现字节阵列不同于我在步骤3之后获得了什么(虽然没有太大差别,因为6转换为7,9到8等等)

我真的不知道为什么会发生这种情况。

+1

可能重复[我正在阅读一张图片并更改它。但更改不会保存](http://stackoverflow.com/questions/25562479/i-am-reading-an-image-and-changing-it-but-the-changes-are-not-being-saved ) – Reti43

回答

0

JPG是一个有损图像格式,所以你不能指望它保存后的数据完全保存。它特别不适合隐写术,因为它会破坏这种使用所需的小细节,即使在使用最高质量的设置时也是如此。

解决方案是使用无损格式,如PNG。

0

BufferedImage可能已经是一个字节数组。如果在创建BufferedImage时使用编码TYPE_BYTE_GRAY,3BYTE_BGR或4BYTE_ABGR,则BufferedImage已经是一个字节数组。要访问字节数组,请执行以下操作:byte[] buffer = ((DataBufferByte)my image.getRaster().getDataBuffer()).getData() ;

而当您将图像写入JPEG时,会压缩并丢失图像。因此,您保存的信息会被更改,无法像以前那样检索。你应该使用PNG/TIFF/BMP,PNG是最常见的。

1
  1. 如果保存为JPEG,RGB数据将转换为YCbCr。这两个颜色空间具有不同的色域,因此值会被钳制。

  2. JPEG数据可能被二次抽样,导致数据被改变。您可以通过不进行二次采样来避免这些更改。

  3. 的JPEG DCT可能引入小的误差(限于+/- 1,如果正确地实施)

  4. 量化将使相当大的变化的数据。您可以通过在量化表中使用全1来避免此步骤的更改。

不管你做什么,#1和#3可以引入在JPEG压缩过程中的变化。