如何从 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 blazor 中的子组件获取属性

如何使用从 React 中的子组件获取的数据更新父组件中的状态

如何从 React 中的高阶组件获取异步数据

如何从 JList 中的组件中获取文本?

如何从 Angular 的弹性框中的组件中获取元素信息

如何从 React 组件 Redux Toolkit 中的 createAsyncThunk 获取结果