4

这不是一个重复的问题,因为我在谷歌和 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();

PS:我用 GIMP 打开第一张图片,发现颜色模式是 'sRGB',没有 alpha 或其他东西。

4

2 回答 2

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

nb- 我用JOptionPane来验证传入的图像。使用ImageIO时带有红色调,Toolkit看起来不错。

更新

解释

于 2013-04-09T07:31:19.673 回答
0

我在netbeans中检查了您的代码并遇到了您的问题,然后我将代码更改如下,没有问题:

    public class Test {

    public static void main(String args[]) throws IOException {


        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);
        fos.write(rawData);
//        ImageIO.write(img, "JPEG", fos);
        fos.flush();
        fos.close();
    }

    private static byte[] getRawBytesFromFile(String path) throws FileNotFoundException, IOException {

        byte[] image;
        File file = new File(path);
        image = new byte[(int)file.length()];

        FileInputStream fileInputStream = new FileInputStream(file);
        fileInputStream.read(image);

        return image;
    }
}

请检查并通知我结果;)

祝你好运

于 2013-04-09T07:16:07.897 回答