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