PNG文件格式和图像字节?

时间:2012-11-29 03:11:38

标签: java file format png byte

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

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

当我在一个只有4个像素大的图像中读到时,我感觉像680个字节是疯了,或者至少我认为是,也许我错了? ARGB的4个像素,每个8位,应该是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”,新文件(                       “image.png”));
              
              // FileOutputStream fos = new FileOutputStream(“image.png”);
              //fos.write(b);
              //fos.close();
          } catch(例外e){}

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

  

byte [] imageBytes = null;
          尝试{
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              ImageIO.write(图片,“jpg”,baos);
              baos.flush();
              imageBytes = baos.toByteArray();
              baos.close();
          } catch(IOException e){System.out.println(e.getMessage());}

  // imageBytes =((DataBufferByte)image.getData()。getDataBuffer())。getData();
          return imageBytes;

谢谢!

2 个答案:

答案 0 :(得分:1)

png由大量图像元数据和原始图像数据组成。这就是给你疯狂的680字节。

答案 1 :(得分:0)

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

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