2

我目前正在尝试编写一个程序来将文本编码为 png 文件,只更改我想在图片中编码的每个字母的最低有效位,例如我有一个 65 的“A”,我使用 8 个不同的字节进行编码字母 A. 所以 01010100<- 10101101<- 11011010<- 10101010<- 每一个我都改变了最后一位,然后把 10110110<- 01010100<- 01010100<- 01010101<- 它们放在一起,所以 65 是 01000001 每个数字箭头根据65改变。

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

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

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

// 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();
返回图像字节;

谢谢!

4

2 回答 2

1

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

于 2012-11-29T03:17:56.330 回答
0

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

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

于 2012-12-08T11:59:57.020 回答