如何从java中的Component获取BufferedImage?

时间:2010-10-04 18:05:52

标签: 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;
  }

2 个答案:

答案 0 :(得分:8)

Component有一个方法paint(Graphics)。该方法将在传递的图形上绘制自己。这是我们将用于创建BufferedImage的内容,因为BufferedImage具有方便的方法getGraphics()。这将返回一个Graphics - 对象,您可以使用该对象在BufferedImage上绘制。

更新:但我们必须为paint方法预先配置图形。这就是我在java.sun.com处发现的关于AWT组件渲染的内容:

  

当AWT调用此方法时,   图形对象参数是   预先配置适当的   借鉴这个特殊的状态   成分:

     
      
  • Graphics对象的颜色设置为组件的前景属性。
  •   
  • 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);
}

答案 1 :(得分:1)

您可以尝试使用Component.paintAll

您还可以将对图形对象(来自缓冲图像)的引用传递给SwingUtilities.paintComponent