如何从 java 中的组件获取 BufferedImage?
Posted
技术标签:
【中文标题】如何从 java 中的组件获取 BufferedImage?【英文标题】:How to get a BufferedImage from a Component in java? 【发布时间】:2011-04-20 22:48:23 【问题描述】:我知道如何从 JComponent 中获取 BufferedImage,但是如何从 java 中的 Component 中获取 BufferedImage 呢?这里的重点是“组件”类型的对象,而不是 JComponent。
我尝试了以下方法,但它返回一个全黑的图像,这是什么问题?
public static BufferedImage Get_Component_Image(Component myComponent,Rectangle region) throws IOException
BufferedImage img = new BufferedImage(myComponent.getWidth(), myComponent.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
myComponent.paint(g);
g.dispose();
return img;
【问题讨论】:
“从 JComponent 获取 BufferedImage”是什么意思? 查看我的新答案。现在它起作用了。 (已测试) 【参考方案1】:Component
有一个方法paint(Graphics)
。该方法将在传递的图形上绘制自己。这就是我们要用来创建BufferedImage
的东西,因为 BufferedImage 有方便的方法getGraphics()
。这将返回一个 Graphics
-object,您可以使用它在 BufferedImage
上绘制。
更新:但我们必须预先配置绘图方法的图形。这就是我在java.sun.com 发现的关于 AWT 组件渲染的内容:
当 AWT 调用此方法时, 图形对象参数是 预先配置了适当的 绘制这个特定的状态 组件:
Graphics 对象的颜色设置为组件的前景属性。 Graphics 对象的字体设置为组件的字体属性。 Graphics 对象的平移设置为坐标 (0,0) 表示组件的左上角。 Graphics 对象的剪辑矩形设置为需要重新绘制的组件区域。
所以,这是我们的结果方法:
public static BufferedImage componentToImage(Component component, Rectangle region) throws IOException
BufferedImage img = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
Graphics g = img.getGraphics();
g.setColor(component.getForeground());
g.setFont(component.getFont());
component.paintAll(g);
if (region == null)
region = new Rectangle(0, 0, img.getWidth(), img.getHeight());
return img.getSubimage(region.x, region.y, region.width, region.height);
【讨论】:
这与您为Component
执行的操作有何不同?我认为这个问题需要澄清一下。
我试过了,还是不行,可能是因为我传递给它的组件是来自 JDIC 的 WebBrowser 对象,它是一个非轻量级组件,正如我在另一个问题中提到的,你知道如何让它工作吗?有人建议我使用 CellRenderPane,但我不知道如何在我的情况下使用它,任何示例代码?
@DavidKroukamp 我认为这不是一个很好的答案。创建具有固定属性的BufferedImage
可能意味着它的处理速度比必要的慢得多。此外,虽然 Q 要求 BufferedImage
,但变化是 Image
就足够了。为什么不直接使用Component.createImage()
?
这对我有用,尽管我在获取子区域方面可能更聪明一些。 img = new BufferedImage(region.width,region.height,...); Graphics2D g = img.createGraphics(); g.translate(-region.x,-region.y);组件.paintAll(g);我确实相信 Java 会根据裁剪边界优化渲染,裁剪边界应该是图像的大小;如果没有,它至少会跳过 getSubimage 步骤。【参考方案2】:
您可以尝试使用Component.paintAll
。
您还可以将 Graphics 对象的引用(来自您的缓冲图像)传递给SwingUtilities.paintComponent
。
【讨论】:
我和你一样,Q 的意图尚未得到澄清。如果您提到了适合您的答案的特定用例,那就太好了。以上是关于如何从 java 中的组件获取 BufferedImage?的主要内容,如果未能解决你的问题,请参考以下文章