Сохранить рисунок в JComponent в файл Tiff

Как сохранить рисунок в JComponent в формате tiff? Я знаю только, как сохранить весь файл Java, но я не знаю, как сохранить конкретный Jcomponent. Помоги мне :-(

EDITED: Спасибо, ребята, теперь я могу сохранить свой рисунок в формате Jpeg.

Однако я просто хотел сохранить один из компонентов? Кажется, что c.paintAll(bufferedImage.getGraphics()); сохраняет весь компонент. Однако я просто хочу сохранить этот компонент c.add(new PaintSurface(), BorderLayout.CENTER); без panel.add(saveBtn); Как мне это сделать? Спасибо.

Container c = getContentPane();
c.setLayout(new BorderLayout());      
Panel panel = new Panel();
panel.add(saveBtn);
c.add("South", panel);
c.setBackground(Color.WHITE);
c.add(new PaintSurface(), BorderLayout.CENTER);

person Jessy    schedule 06.10.2009    source источник


Ответы (3)


Это по существу идентично решению broschb, только с использованием правильного синтаксис и вызов соответствующих подпрограмм JAI.

public void saveComponentAsTiff(Component c, String filename, boolean subcomp) throws IOException {
    saveComponentTiff(c, "tiff", filename, subcomp);
}

public void saveComponent(Component c, String format, String filename, boolean subcomp) throws IOException {
    // Create a renderable image with the same width and height as the component
    BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);

    if(subcomp) {
        // Render the component and all its sub components
        c.paintAll(image.getGraphics());
    }
    else {
        // Render the component and ignoring its sub components
        c.paint(image.getGraphics());
    }

    // Save the image out to file
    ImageIO.write(image, format, new File(filename));
}

Документацию по различным функциям можно найти здесь:

Если вы хотите сохранить в формате, отличном от tiff, вы можете использовать ImageIO.getWriterFormatNames(), чтобы получить список всех форматов вывода изображений, загруженных в настоящее время JRE.

ОБНОВЛЕНИЕ: Если вы не заинтересованы в рисовании подкомпонентов, вы можете заменить вызов Component.paintAll(...) на Component.paint(...). Я изменил код примера, чтобы отразить это. Установка для subcomp значения true с рендерингом подкомпонентов и установка для него значения false будут их игнорировать.

person Kevin Loney    schedule 06.10.2009

Класс ScreenImage позволяет сохранить изображение любого компонента .

person camickr    schedule 06.10.2009

вы можете получить буферизованное изображение компонента или панели, содержащей чертеж, создав буферизованное изображение размером с панель. Затем вы можете нарисовать содержимое панелей на буферизованном изображении. Затем вы можете использовать библиотеку JAI (Java Advanced Imaging), чтобы сохранить буферизованное изображение в формате tiff. Вам нужно будет проверить документы по этому здесь.

JComponent component;  //this is your already created component
BufferedImage image = new BufferedImage(component.getWidth(),
                                        component.getHeight(),
                                        Bufferedimage.TYPERGB)

Graphics g = image.getGraphics;
component.paintComponent(g);

Синтаксис может немного отличаться, я не в курсе, но это общая идея. Затем вы можете использовать JAI и преобразовать буферизованное изображение в TIFF.

person broschb    schedule 06.10.2009