我目前正在尝试编写一个程序来将文本编码为 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();
返回图像字节;
谢谢!