如何在Java中读取图像的字节?

时间:2014-01-23 07:14:20

标签: java image inputstream javax.imageio fileoutputstream

我目前正在使用Java中的图像处理。最初我使用ImageIO类来编写图像

ImageIO.write(image,"jpg",os);

这种方法的问题是失去了实际的图像尺寸和质量。然后我更喜欢ByteStream

Files.readAllBytes(fi.toPath());

阅读和

fos.write(fileContent);

写图像。这非常有效。我在这里遇到的问题是我只能读取文件但不能读取图像(即BuffreredImage图像)。是否可以在此处读取图像而不是文件,还是应该转移到其他IO?

代码段就在这里,

try {

File fnew=new File("d:\\3\\IMG1.jpg"); 
java.io.FileOutputStream fos = new java.io.FileOutputStream(new             File("d:\\3\\Test1\\4.jpg"));
File fi = new File("d:\\3\\7.jpg");
byte[] fileContent = Files.readAllBytes(fi.toPath());
fos.write(fileContent);

} catch (Exception e) {

System.out.println("Exception");
}

任何建议或帮助将不胜感激。在此先感谢。

2 个答案:

答案 0 :(得分:0)

  

这种方法的问题是失去了实际的图像尺寸和质量。然后我更喜欢ByteStream

当您使用ImageIO读取JPEG时,它会自动将JPEG转换为位图。然后当你编写它时,它再次编码为JPEG(失去了质量)。

只需将ImageIO.write(image,"jpg",os)替换为ImageIO.write(image,"png",os),即可完成。写入图像时,PNG等无损格式不会丢失任何数据。

答案 1 :(得分:0)

BufferedImage getRGB()将获取图像的所有实际像素数据。不会有压缩或JPEG之类的东西。这将是原始形象。

根据我的评论编辑添加示例...

    BufferedImage image = ImageIO.read(new File("google.jpg"));
    ImageWriter w = ImageIO.getImageWritersBySuffix("jpg").next();
    ImageOutputStream out = ImageIO.createImageOutputStream(new File("output.jpg"));
    w.setOutput(out);
    ImageWriteParam param = new JPEGImageWriteParam(Locale.getDefault());
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(1);
    w.write(null, new IIOImage(image, null, null), param);
    out.close();