簡體   English   中英

如何拍攝自定義形狀的屏幕截圖?

[英]How to take a custom shaped screenshot?

為了在Java中創建屏幕截圖,我一直使用java.awt.Robot類的createScreenCapture()方法。 但是我只能以Rectangle形狀創建屏幕截圖。 現在我的問題是,是否可以使用Robot類或其他一些顯式代碼來截取自定義形狀的屏幕截圖?

順便說一句,對於自定義形狀,屏幕截圖必須是透明的,我很可能以PNG格式存儲它。

任何答案表示贊賞。

是否可以通過使用Robot類或其他一些顯式代碼來截取自定義形狀的屏幕截圖?

我喜歡安德魯·湯普森(Andrew Thompson)的解決方案,該解決方案顯示了如何從矩形圖像創建形狀的圖像。 請參見以文字形狀切出圖像

您可以采用任何形狀。 例如,您可以通過執行以下操作來創建自己的多邊形:

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);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM