爲了在Java中創建屏幕截圖,我一直在使用java.awt.Robot
類的'createScreenCapture()
方法。但我只能在Rectangle
形狀中創建屏幕截圖。現在我的問題是有沒有辦法通過使用Robot
類或其他顯式代碼來截取自定義形狀的截圖?如何自定義形狀的截圖?
順便說一下,自定義形狀的截圖必須是透明的,我可能會將其存儲在PNG格式。
任何答案表示讚賞。
爲了在Java中創建屏幕截圖,我一直在使用java.awt.Robot
類的'createScreenCapture()
方法。但我只能在Rectangle
形狀中創建屏幕截圖。現在我的問題是有沒有辦法通過使用Robot
類或其他顯式代碼來截取自定義形狀的截圖?如何自定義形狀的截圖?
順便說一下,自定義形狀的截圖必須是透明的,我可能會將其存儲在PNG格式。
任何答案表示讚賞。
有沒有什麼方法通過使用Robot類或其他顯式代碼來拍攝自定義形狀的截圖?
我喜歡Andrew Thompson的解決方案,該解決方案顯示如何從矩形圖像創建成形圖像。請參閱Cut Out Image in Shape of Text。
你可以用任何形狀做到這一點。
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);
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);
}
}
我指的是用戶直接選擇一個形狀,而不是選擇一個矩形,然後重新塑造它。 (感謝回答+1) – user12458
我喜歡你做事的方式,它們很簡單:)在過去,'SimpleAttributeSet'和現在的'Polygon'。感謝您的免費教學:)! – user12458
@JavaTechnical,但你不接受答案,除非他們是你自己的問題的答案。 – camickr