我目前正在使用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");
}
任何建议或帮助将不胜感激。在此先感谢。
答案 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();