首页 文章

PNG文件格式和图像字节?

提问于
浏览
2

我目前正在尝试编写一个程序,将文本编码为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”,new File(“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 回答

  • 1

    png由许多图像元数据以及原始图像数据组成 . 这就是给你疯狂的680字节 .

  • 0

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

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

相关问题