2

我想将 a 转换ImageBufferedImage. 我知道以下内容:

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 faster and simple way

4

4 回答 4

3

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 的图像。

于 2014-03-10T19:52:14.963 回答
2

如果您在 上查询getHeight()orgetWidth()方法,ToolkitImage您将触发 internal 的生成BufferedImage。所以你的代码会变成:

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

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

于 2014-04-21T14:01:04.547 回答
2

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

于 2013-12-04T08:39:11.253 回答
1

我不知道转换ImageBufferedImage仅使用 JDK 的更快方法。如果您不受限制,也许您可​​以用 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()返回非引用。再读一遍最后一句话。重要的术语是生成的。这种方法不是“免费”的,而且肯定会产生大量的处理成本来将内部数据转换为. 大多数情况下(99%)没有生成,所以返回值为. JDK 源代码参考nullTookitImageBufferedImageBufferedImagenull
于 2013-08-08T15:28:46.220 回答