Как получить BufferedImage от компонента в Java? - PullRequest
6 голосов
/ 04 октября 2010

Я знаю, как получить BufferedImage от JComponent, но как получить BufferedImage от Компонента в Java? Акцент здесь делается на объект типа «Компонент», а не 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 ]

8 голосов
/ 04 октября 2010

Component имеет метод paint(Graphics). Этот метод будет рисовать себя на переданной графике. Это то, что мы будем использовать для создания BufferedImage, потому что у BufferedImage есть удобный метод getGraphics(). Это возвращает Graphics -объект, который вы можете использовать для рисования на BufferedImage.

ОБНОВЛЕНИЕ: Но мы должны предварительно сконфигурировать графику для метода рисования. Это то, что я нашел о рендеринге компонентов AWT на java.sun.com :

Когда 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);
}
1 голос
/ 04 октября 2010

Вы можете попробовать использовать Component.paintAll.

Вы также можете передать ссылку на графический объект (исходя из буферизованного изображения) на SwingUtilities.paintComponent.

...