2013-07-20 260 views
0

爲了在Java中創建屏幕截圖,我一直在使用java.awt.Robot類的'createScreenCapture()方法。但我只能在Rectangle形狀中創建屏幕截圖。現在我的問題是有沒有辦法通過使用Robot類或其他顯式代碼來截取自定義形狀的截圖?如何自定義形狀的截圖?

順便說一下,自定義形狀的截圖必須是透明的,我可能會將其存儲在PNG格式。

任何答案表示讚賞。

回答

3

有沒有什麼方法通過使用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); 
+0

我指的是用戶直接選擇一個形狀,而不是選擇一個矩形,然後重新塑造它。 (感謝回答+1) – user12458

+0

我喜歡你做事的方式,它們很簡單:)在過去,'SimpleAttributeSet'和現在的'Polygon'。感謝您的免費教學:)! – user12458

+0

@JavaTechnical,但你不接受答案,除非他們是你自己的問題的答案。 – camickr

2

Graphics#setClip(Shape)工作正常(如camickr已經建議):例如,你可以通過做一些像創建自己的多邊形

enter image description here

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