Fra*_*ank 6 java components bufferedimage
我知道如何从JComponent获取BufferedImage,但是如何从java中的Component获取BufferedImage?这里强调的是"Component"类型的对象而不是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;
}
Run Code Online (Sandbox Code Playgroud)
Component有一个方法paint(Graphics).该方法将在传递的图形上绘制自己.这是我们将要用来创建的BufferedImage,因为BufferedImage具有方便的方法getGraphics().返回一个Graphics可以用来绘制的对象BufferedImage.
更新:但我们必须为paint方法预先配置图形.这就是我在java.sun.com上发现的关于AWT组件渲染的内容:
当AWT调用此方法时,Graphics对象参数已预先配置为在此特定组件上绘制的适当状态:
- Graphics对象的颜色设置为组件的foreground属性.
- Graphics对象的字体设置为组件的font属性.
- 设置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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7007 次 |
| 最近记录: |