为什么ToolkitImage getBufferedImage()返回null?

时间:2013-05-13 13:13:11

标签: java image image-processing bufferedimage

我想将Image转换为BufferedImage。我知道以下内容:

Image tmp;
... //read, scale
BufferedImage buffered = new BufferedImage(SMALL_SIZE, SMALL_SIZE,
                BufferedImage.TYPE_INT_RGB);
buffered.getGraphics().drawImage(tmp, 0, 0, null);

但它真的很慢。我需要BufferedImage,因为我必须得到像素颜色数据。 我发现了一种可能的方法,没有绘图:

ToolkitImage ti = (ToolkitImage) tmp;
BufferedImage buffered = tmp.getBufferedImage();

但它始终返回null 。任何人都可以为此提供解决方案吗?

修改 更大的任务(这个问题的根源)在这里: Scale a BufferedImage the fastest and easiest way

4 个答案:

答案 0 :(得分:2)

有同样的问题。出于一些奇怪的原因,我设法通过ImageIcon获取图像。所以我将byteArray(imageDate)加载到ImageIcon中,然后从ImageIcon中读取图像,它工作正常。

答案 1 :(得分:2)

ToolkitImage与BufferedImage的转换问题相同。

Graphics2D g2d = buffImage.createGraphics();
g2d.drawImage(image, 0, 0, null);
g2d.dispose();

- 没有为缓冲的图片绘制任何内容,image.getBufferedImage();null

这是有帮助的,使用ImageIcon初始化原始Image中的一些内部内容。

ToolkitImage toolkitImage = (ToolkitImage) Toolkit.getDefaultToolkit().createImage("image.jpg");

Image temporary = new ImageIcon(toolkitImage).getImage();

BufferedImage buffImage = new BufferedImage(toolkitImage.getWidth(), toolkitImage.getHeight(),
        BufferedImage.TYPE_INT_ARGB);

Graphics2D g2d = buffImage.createGraphics();
g2d.drawImage(temporary, 0, 0, null);
g2d.dispose();

之后,buffImage包含来自toolkitImage的图像。

答案 2 :(得分:2)

如果您在getHeight()上查询getWidth()ToolkitImage方法,则会触发内部BufferedImage的生成。所以你的代码将成为:

ToolkitImage ti = (ToolkitImage) tmp;
ti.getWidth();
BufferedImage buffered = ti.getBufferedImage();

我怀疑这会比你描述的drawImage()方法更快,但值得一试。

答案 3 :(得分:1)

我不知道使用JDK将Image转换为BufferedImage的更快捷方式。如果您不受限制,也许您可​​以用C或C ++编写更快的解决方案并通过JNI访问。我敢打赌ImageMagick有一些疯狂的快速优化程序。 修改:这个答案有一个很好的建议:https://stackoverflow.com/a/7726679/257299

另一种策略是避免调用Image Toolkit.getImage(URL)。这需要转换为BufferedImage。相反,请尝试:BufferedImage ImageIO.read(File)

关于BufferedImage ToolkitImage.getBufferedImage()始终返回null的原因:

  1. ToolkitImagesun包的一部分,它不被视为JDK公共API的一部分。避免直接使用。我知道:如果您编写Swing代码,您会看到人们经常违反此规则,因为Sun在Swing中大量使用了非公共类。 (SwingUtilities使用包私有方法和类做各种偷偷摸摸的事情。)
  2. 方法getBufferedImage()如果null内部生成缓存图片,则会返回非TookitImage引用。再读一遍最后一句话。重要的术语是生成。这种方法不是“免费”的,将内部数据转换为BufferedImage肯定会产生大量处理成本。大多数情况下(99%)尚未生成BufferedImage,因此返回值为nullJDK Source Reference