将 JPanel 转换为图像

Posted

技术标签:

【中文标题】将 JPanel 转换为图像【英文标题】:Convert JPanel to image 【发布时间】:2010-11-23 20:50:30 【问题描述】:

有没有办法将 JPanel(尚未显示)转换为 BufferedImage?

谢谢,

杰夫

【问题讨论】:

好吧,我放弃了。在您完全忽略的最后两个帖子中,我给了您两个答案。祝你以后的帖子好运。 我很欣赏这些回复,我并没有忽略它们。在这篇文章中,ScreenImage 并不是我想要的,而这种仅在其他图形上绘画的方法对我来说似乎是正确的方向。在对话框帖子上,结果证明这不是问题,我已经被淹没了,所以我没有回复所有内容。非常感谢您的回复。 【参考方案1】:

您可以从 BufferedImage 创建一个图形对象,您可以使用它在 JPanel 上调用绘画,例如:

public BufferedImage createImage(JPanel panel) 

    int w = panel.getWidth();
    int h = panel.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    panel.paint(g);
    g.dispose();
    return bi;

您可能需要确保先设置面板的大小。

【讨论】:

很好,谢谢。有没有办法我可以弄清楚面板尺寸应该是多少(也许是它的首选尺寸)? 我相信它是首选尺寸或当前尺寸,只要它已经被渲染。如果它还没有被渲染,就会出现问题——我不记得确切的细节,但我记得在实现打印系统时遇到了类似的属性。 是的,首选尺寸有效,但正如您所说,如果面板尚未显示,它不会呈现,这对我并没有太大帮助。有没有办法“渲染”它但不在屏幕上显示?基本上我正在构建一个需要写入图像但不显示的组件。 嗯..如果组件尚未显示,printAll 仍然无法工作。 @JeffStorey 你是如何让面板上的东西在创建的图像中可见的??【参考方案2】:

基本上我正在构建一个组件 需要写入图像 但不显示

ScreenImage 解释如何做你想做的事。


ScreenImage.java 的相关部分(稍作编辑)。 layoutComponent 强制所有按钮出现在图像中。

/**
 * @return Renders argument onto a new BufferedImage
 */
public BufferedImage createImage(JPanel panel, int width, int height) 
    BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = bi.createGraphics();
    panel.setSize(width, height); // or panel.getPreferedSize()
    layoutComponent(panel);
    panel.print(g);
    g.dispose();
    return bi;


private void layoutComponent(Component component) 
    synchronized (component.getTreeLock()) 
        component.doLayout();

        if (component instanceof Container) 
            for (Component child : ((Container) component).getComponents()) 
                layoutComponent(child);
            
        
    

【讨论】:

【参考方案3】:

Tom的回答基本正确,但不建议直接调用paint(),因为它是同步调用,可以中断swing线程上的其他操作。与其使用paint(),不如使用print()

public BufferedImage createImage(JPanel panel) 

    int w = panel.getWidth();
    int h = panel.getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bi.createGraphics();
    panel.print(g);
    g.dispose();
    return bi;

【讨论】:

【参考方案4】:

看看 BasicTableUI。单元格渲染器在图像上绘制而不显示,然后在可见的表格组件上绘制。

【讨论】:

以上是关于将 JPanel 转换为图像的主要内容,如果未能解决你的问题,请参考以下文章

将 JPanel 保存为图像

将 JPanel 保存为图像(不是文件,而是变量)

怎么用ABBYY将PDF转换为JPEG图像

怎么用ABBYY将PDF转换为JPEG图像

转换语音就像将彩色图像转换为灰度?

将 SVG 动画转换为图像序列