使用红色蒙版创建的 java 缓冲图像

标签 java awt java-2d

我无法读取图像。如果我执行以下操作

URL url = new URL("http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg");
ImageInputStream stream = ImageIO.createImageInputStream(url.openStream());
ImageReader reader = ImageIO.getImageReaders(stream).next();
reader.setInput(stream, true, true);
BufferedImage image = reader.read(0);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(bos);
writer.setOutput(ios);
IIOImage ioImage = new IIOImage(image, null, null);
writer.write(ioImage);
ios.close();
FileOutputStream fos = new FileOutputStream("badimage.jpeg");
fos.write(bos.toByteArray());
fos.close();

图像是用红色调书写的。是否需要设置一些选项才能正确读取此图像?

最佳答案

问题可能与未能正确读取某些 JPG 图像的 ImageIO.read 有关。这是一个类似的 bug (错误 ID:4881314)可能仍部分未解决。

作为替代方案,您可以尝试使用似乎可以正确处理指定图像的 Toolkit.createImage。例如:

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

class TestImage {
    public static void main(String args[]) {
        try {
            URL imageUrl = new URL(
                "http://tctechcrunch2011.files.wordpress.com/2012/10/gmm.jpg");
            BufferedImage ioImage = ImageIO.read(imageUrl);
            Image toolkitImage = Toolkit.getDefaultToolkit().createImage(
                    imageUrl);

            JPanel panel = new JPanel();
            panel.add(new JLabel(new ImageIcon(ioImage)));
            panel.add(new JLabel(new ImageIcon(toolkitImage)));

            JOptionPane.showMessageDialog(null, panel, "ImageIO vs Toolkit",
                    JOptionPane.INFORMATION_MESSAGE);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Failure",
                    JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }
}

结果如下:

enter image description here

关于使用红色蒙版创建的 java 缓冲图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963685/

相关文章:

java - Java 6 中的椭圆曲线密码术

java - 在 Java 中检查文本的字体属性

java - 在屏幕中间绘制文本

Java 缓冲区策略导致严重滞后

java - 如何将 java.util.function.Predicate 实现为 Kotlin lambda?

java - 如何重写迭代器 `next()` 以返回 Set<E> 而不是 E?

java - 使用对象的 ArrayList 填充 CardView android

java.awt.矩形。路口()

java - 打印整个程序布局

java - 绘制多边形时出现 ArrayIndexOutOfBoundsException 错误