如何使用Java将JPEG图像读入BufferedImage对象

vic*_*que 4 java jpeg image

这不是一个重复的问题,因为我一直在Google和StackOverflow中搜索解决方案,但仍然无法找到解决方案.

我有这两个图像:

更大的图像

较小的图像

这些是来自同一网站的两个图像,具有相同的前缀和相同的格式.唯一的区别是尺寸:第一个更大,而第二个更小.

我将这两个图像下载到本地文件夹,并使用Java将它们读入BufferedImage对象.但是,当我将BufferedImages输出到本地文件时,我发现第一张图像几乎是红色,而第二张图像是正常的(与原始图像相同).我的代码出了什么问题?

byte[] rawData = getRawBytesFromFile(imageFilePath); // some code to read raw bytes from image file
ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(rawData));
BufferedImage img = ImageIO.read(iis);
FileOutputStream fos = new FileOutputStream(outputImagePath, false);
ImageIO.write(img, "JPEG", fos);
fos.flush();
fos.close();
Run Code Online (Sandbox Code Playgroud)

PS:我使用GIMP打开第一张图像并检测到颜色模式是'sRGB',没有alpha或其他东西.

Mad*_*mer 9

这显然是一个知识错误,我看到了一些建议(是一个)建议使用Toolkit#createImage,这显然忽略了颜色模型.

我测试了它,似乎工作正常.

public class TestImageIO01 {

    public static void main(String[] args) {
        try {
            Image in = Toolkit.getDefaultToolkit().createImage("C:\\hold\\test\\13652375852388.jpg");

            JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(in)), "Yeah", JOptionPane.INFORMATION_MESSAGE);

            BufferedImage out = new BufferedImage(in.getWidth(null), in.getHeight(null), BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = out.createGraphics();
            g2d.drawImage(in, 0, 0, null);
            g2d.dispose();

            ImageIO.write(out, "jpg", new File("C:\\hold\\test\\Test01.jpg"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

nb-我用它JOptionPane来验证传入的图像.使用时,ImageIO它带有红色调,Toolkit看起来很好.

更新

移出