Как сделать скриншот произвольной формы?

Для создания скриншотов на Java я использовал метод createScreenCapture() класса java.awt.Robot. Но мне удалось создать скриншоты только в форме Rectangle. Теперь мой вопрос: есть ли способ сделать снимок экрана пользовательской формы, используя класс Robot или какой-либо другой явный код?

И, кстати, для пользовательской формы скриншот должен быть прозрачным, и я, скорее всего, сохраню его в формате PNG.

Любой ответ приветствуется.


person JavaTechnical    schedule 20.07.2013    source источник


Ответы (2)


Есть ли способ сделать снимок экрана пользовательской формы с помощью класса Robot или какого-либо другого явного кода?

Мне нравится решение Эндрю Томпсона, которое показывает, как создать фигурное изображение из прямоугольного изображения. См. раздел Вырезать изображение по форме текста.

Вы можете сделать это с любой формой. Например, вы можете создать свой собственный многоугольник, выполнив что-то вроде:

Polygon polygon = new Polygon();
polygon.addPoint(250, 50);
polygon.addPoint(350, 50);
polygon.addPoint(450, 150);
polygon.addPoint(350, 150);
g.setClip(polygon);
g.drawImage(originalImage, 0, 0, null);
person camickr    schedule 20.07.2013
comment
Я имею в виду, что пользователь должен самостоятельно выбирать фигуру, а не выбирать прямоугольник, а затем изменять его форму. (Спасибо за ответ +1) - person JavaTechnical; 21.07.2013
comment
Мне нравятся ваши способы ведения дел, они простые :) Раньше SimpleAttributeSet, а теперь Polygon. Спасибо за бесплатное обучение :)! - person JavaTechnical; 21.07.2013
comment
@JavaTechnical, и все же вы не принимаете ответы, если они не являются вашими собственными ответами на ваши собственные вопросы. - person camickr; 21.07.2013
comment
;) Ха-ха! Ой! Я забыл об этом, я просто посещал SO, но, как вы можете заметить, не занимался никакой деятельностью! принятый. - person JavaTechnical; 22.07.2013

Graphics#setClip(Shape) отлично работает (как уже предложил camickr):

введите здесь описание изображения

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ScreenShotClipTest {
  private JComponent makeUI() {
    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(new JTree()));
    p.add(new JButton(new AbstractAction("screenshot") {
      @Override public void actionPerformed(ActionEvent e) {
        JButton b = (JButton)e.getSource();
        Window f = SwingUtilities.getWindowAncestor(b);
        try {
          BufferedImage ss = new Robot().createScreenCapture(f.getBounds());
          int w = ss.getWidth(null), h = ss.getHeight(null);
          BufferedImage bi = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
          Graphics g = bi.createGraphics();
          g.setClip(new RoundRectangle2D.Float(0,0,w,h,64,64));
          g.drawImage(ss, 0, 0, null);
          g.dispose();
          ImageIO.write(bi, "png", new File("screenshot.png"));
        } catch(Exception ex) {
          ex.printStackTrace();
        }
      }
    }), BorderLayout.SOUTH);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    final JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new ScreenShotClipTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
person aterai    schedule 20.07.2013