Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中读取图像的字节?_Java_Image_Inputstream_Javax.imageio_Fileoutputstream - Fatal编程技术网

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

如何在Java中读取图像的字节?,java,image,inputstream,javax.imageio,fileoutputstream,Java,Image,Inputstream,Javax.imageio,Fileoutputstream,我目前正在用Java进行图像处理。最初我使用ImageIO类来编写图像 ImageIO.write(image,"jpg",os); 这种方法的问题是丢失了实际的图像大小和质量。然后我更喜欢ByteStream Files.readAllBytes(fi.toPath()); 阅读和 fos.write(fileContent); 写图像。这很好用。我在这里面临的问题是,我只能读取文件,但不能读取图像(即,BuffreredImage图像)。是否可以在此处读取图像而不是文件,或者是否应该移

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

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

Files.readAllBytes(fi.toPath());
使用ImageIO读取JPEG时,它会自动将JPEG转换为位图。然后,当您编写它时,它将再次编码为JPEG(这将丢失质量)

只需将
ImageIO.write(image,“jpg”,os)
替换为
ImageIO.write(image,“png”,os)
,您就完成了。无损格式(如PNG)在写入图像时不会丢失任何数据。

BuffereImage 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();

我的输入类型是“仅图像”而不是“文件”:-(您可以编辑问题并添加额外细节@Laxman-我正在处理图像(读取图像、更改质量、调整大小、设置水印并最终将其写入目标)。问题是,如果我使用ImageIO.write(),则在写入时会失去实际的图像质量。因此,我转到FileOutputStream并读取字节[]。我的问题是,当输入是图像时,是否有可能读取图像的字节?或者我是否应该使用其他IO?@J_用户读取图像不是问题。使用不同的IO不会有任何帮助。位图和JPEG之间的转换会降低质量。@Navin我只将JPEG图像作为输入。我不会更改其格式aNYPROCESS上的何处。ImageIO.write()是否更改图像格式?但JPEG文件不存储RGB像素。DCT会出现一些错误。他在写入图像时必须使用无损格式。如果质量是唯一的问题(不是原始数据),您可以使用ImageIO获取ImageWriter,然后使用ImageWriterParam设置质量答:编写JPEG时不可能不降低质量。如果原版是JPEG,理论上你可以使用完全相同的哈夫曼表进行近乎无损的重新压缩。有无损JPEG,它只是不是标准JDK的一部分。第三方库支持它。也就是说,上面质量设置为100%的代码非常有用n关闭。不,您将只生成大文件。质量仍将比原始文件差,除非原始文件使用相同的表进行压缩(不太可能).JPEG无损或JPEG-LS可以工作,但这有点人为,因为它们是完全不同的算法,工具支持较少,可能会首先破坏使用JPEG的目的。只需使用PNG或TIFF即可。:-)我的输出文件应该是JPEG。这就是问题所在。在ImageIO.write()中不可能进行无损jpg文件写入,我想@J_用户如果不支持无损JPEG,则必须使用其他库。为什么需要JPEG?它实际上是最差的图像格式。