2010-10-04 4 views
6

Я знаю, как получить BufferedImage от JComponent, но как получить BufferedImage из компонента в java? Основное внимание здесь уделяется объекту типа «Компонент», а не JComponent.Как получить BufferedImage из компонента в java?

Я пробовал следующий метод, но он возвращает все черное изображение, что с ним не так?

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; 
    } 
+1

Что вы имеете в виду "получить BufferedImage от JComponent"? – aioobe

+0

Проверьте мой новый ответ. Теперь это работает. (Протестировано) –

ответ

1

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

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

+0

Я с вами, что намерение Q не выяснено. Было бы неплохо, если бы вы упоминали конкретный вариант использования, для которого подходит ваш ответ. –

8

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

UPDATE: Но мы должны предварительно сконфигурировать графику для метода краски. Вот что я нашел про AWT компонентов рендеринга в java.sun.com:

Когда AWT вызывает этот метод, График параметра объекта предварительно настроено с соответствующим состояния для рисования на данном конкретном компонента:

  • Цвет объекта 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

Как это отличается от того, как вы это сделаете для «Компонента»? Я думаю, что этот вопрос нуждается в уточнении. – aioobe

+0

Я пытаюсь, все еще не сработал, может быть, потому что Компонент, который я передал ему, является объектом WebBrowser от JDIC, ​​это не легкий вес Компонент, как я упоминал в моем другом вопросе, знаете ли вы, как заставить его работать? Кто-то предложил использовать CellRenderPane, но я не знаю, как использовать его в моем случае, какой-нибудь пример кода? – Frank

+0

+1 execellent ответ –