【问题标题】:PNG File format and Image bytes?PNG文件格式和图像字节?
【发布时间】:2012-11-17 01:54:03
【问题描述】:

我目前正在尝试编写一个程序来将文本编码为 png 文件,只更改我想在图片中编码的每个字母的最低有效位,例如 我有一个 65 的“A”,我使用 8 个不同的字节来编码字母 A。所以 01010100

如果我应该以不同的方式解决这个问题,建议会很棒:)。这只是 我想做的一个有趣的小项目。但无论如何,回到我的问题。

当我读入一张只有 4 像素大的图像时,我得到了 680 字节,这太疯狂了,或者至少我认为是这样,也许我错了? 4 个像素,每个 8 位的 ARGB 应该是 16 个字节,其中几个字节肯定会告诉操作系统它是一个 png 以及如何处理它。所以我期待可能像 30 个字节。也许更少。我看错了吗?当png图像被压缩时,如果它是一张小图片,它们会变得更大吗?而且,当我将它保存回硬盘时,我总是得到一个更大的文件。原来的图片是8,554 kb,然后我保存回来时变成了16kb。这是获取图像字节和保存图像的代码。也许我做错了什么,或者我没有正确理解它。

这些是我获取图像的方式(我尝试了 2 种不同的方法)

// BufferedImage img = ImageIO.read(new File("image.png"));
BufferedImage img= robot.createScreenCapture(new Rectangle(1,2,2,2));

我是如何再次以两种不同的方式保存的。

试试{
InputStream in = new ByteArrayInputStream(imgBytes);
BufferedImage bImageFromConvert = ImageIO.read(in);
ImageIO.write(bImageFromConvert, "png", new File( "image.png"));

//FileOutputStream fos = new FileOutputStream("image.png");
//fos.write(b);
//fos.close();
}catch(异常 e){}

我是如何从图像中获取字节的,我再次尝试了两种不同的方法,被注释掉的第二种方法实际上确实给了我想要的 16 个字节,但是当我保存它时,Windows 无法打开它,因为它不知道我猜是什么?不确定,只是说文件不支持。

字节[] imageBytes = null;
试试{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
baos.flush();
imageBytes = baos.toByteArray();
baos.close();
}catch(IOException e){System.out.println(e.getMessage());}

// imageBytes = ((DataBufferByte) image.getData().getDataBuffer()).getData();
返回图像字节;

谢谢!

【问题讨论】:

    标签: java file format png byte


    【解决方案1】:

    一个 png 包含大量图像元数据以及原始图像数据。这就是给你疯狂的 680 字节的原因。

    【讨论】:

    • 那么我应该使用不同的格式吗?还是可以接受更改这些字节?我不知道我该怎么办xD
    • 所有图片都有一定的元数据,否则渲染器不知道怎么渲染。 png 还将其图像数据分块,并且每个块都有一些大小开销。 w3.org/TR/2003/REC-PNG-20031110。我对你想要做什么有点困惑,如果你想生成一个经过一些修改的可渲染图像,你需要在编码之前改变图像。即在 ImageIO.write 调用之前,否则您将拥有的只是一个损坏的文件。
    • 对于小图像,由于标题开销,png 或任何其他可压缩图像将大于原始图像。不可压缩的图像总是比原始图像数据大。如果你想要一个无损的图像,PNG 就很好,否则 jpg 也一样好。
    • 我需要相同的图像我不能让它丢失数据,因为我需要在之后将消息取回。从原始图像中获取字节后,我将修改图像,然后我将更改这些字节并再次将图像写入不同的名称,因此图像看起来相同但稍作更改,以便之后我可以接收图像,这是隐写术。所以现在的问题是,我可以在不弄乱文件的情况下更改哪些字节?哪些字节是 ARGB 的字节?谢谢!
    【解决方案2】:

    我的条形码字体也有几乎相同的问题。我只是想将 5 位数据编码成我能得到的最小的 PNG。我不想做的是编写一个基于 libpng 的自定义程序。我尝试了很多编辑器,我能得到的最小文件大小约为 170 字节。

    我终于找到了 Gimp 2.0。您可以使用一项功能来导出没有所有元数据的 PNG 文件。我也改成8位灰度。我想我可以通过切换到 2 位灰度来减少几个字节,但 Gimp 不会为我这样做。最后,我对每个字符约 75 个字节感到满意。

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2015-09-03
      • 2018-05-04
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多