2012-08-08 94 views
1

我發現繪製圖像的一部分的唯一方法是使用此功能drawImage其他子參考圖像的方式?

公共抽象布爾的drawImage(Image img時,INT DX1,DY1 INT,INT DX2,詮釋DY2,詮釋SX1,SY1 INT ,int sx2,int sy2,ImageObserver觀察者)

有沒有辦法繪製一個只需要目標座標而不是矩形的圖像部分?我想指定我的圖像剪切,然後在座標處繪製它,而不必擔心目標矩形與剪切的大小相匹配。我發現這樣有更多的錯誤空間,就像你弄錯了一樣,擠壓/拉伸你的圖像以適應等等。另外當你在屏幕上移動圖像時,它意味着移動兩組點而不是一個簡單的左上角座標點。

(我敢肯定,我看到那裏有人做到這一點我只是不記得功能就是視頻)

回答

2

你可以從你的圖片創建一個子圖像,然後得出。

請查閱BufferedImage API,getSubImage()方法。這將從大圖像中返回一個作爲BufferedImage對象的剪切圖像。然後你可以用一個簡單的drawImage(...)超負荷來描繪這個位置。

例如:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class SubImageEg extends JPanel { 
    // images from Wikimedia Commons 
    // http://commons.wikimedia.org/wiki/Main_Page 
    public static final String MAIN_IMG_PATH = "http://upload.wikimedia.org/wikipedia/commons/" + 
     "thumb/4/43/Sarcophilus_harrisii_taranna.jpg/800px-Sarcophilus_harrisii_taranna.jpg"; 
    public static final String SECOND_IMG_PATH = "http://upload.wikimedia.org/wikipedia/commons/" + 
     "thumb/f/f8/Soldering_a_0805.jpg/800px-Soldering_a_0805.jpg"; 
    public static final String[] IMAGE_PATHS = {MAIN_IMG_PATH, SECOND_IMG_PATH}; 
    private static final int SUB_X = 520; 
    private static final int SUB_Y = 340; 
    private static final int SUB_W = 150; 
    private static final int SUB_H = 150; 
    private static final int SEC_SUB_X = 400; 
    private static final int SEC_SUB_Y = 200; 

    private BufferedImage[] images = new BufferedImage[IMAGE_PATHS.length]; 
    private BufferedImage secondImgSubImg; 

    public SubImageEg() { 
     try { 
     for (int i = 0; i < IMAGE_PATHS.length; i++) { 
      images[i] = ImageIO.read(new URL(IMAGE_PATHS[i])); 
     } 

     secondImgSubImg = images[1].getSubimage(SUB_X, SUB_Y, SUB_W, SUB_H); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (images[0] != null) { 
     g.drawImage(images[0], 0, 0, this); 
     } 
     if (secondImgSubImg != null) { 
     g.drawImage(secondImgSubImg, SEC_SUB_X, SEC_SUB_Y, this); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (images[0] != null) { 
     return new Dimension(images[0].getWidth(), images[0].getHeight()); 
     } else { 
     return super.getPreferredSize(); 
     } 
    } 

    private static void createAndShowGui() { 
     SubImageEg mainPanel = new SubImageEg(); 

     JFrame frame = new JFrame("SubImageEg"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

謝謝!就是這樣。 – 2012-08-08 03:31:35

+0

@約翰史密斯:你很受歡迎! – 2012-08-08 03:32:25