GUI程式設計基礎學習(五)——圖片的獲取、顯示及裁剪
介紹:
Java提供了java.awt.Image包來管理與影象檔案相關的資訊,因此執行與影象檔案有關的操作需要匯入這個包。
除了Image類之外,java.awt包還提供了其他的基本影象支援,例如Graphics類的drawImage()方法、Toolkit物件的getImage()方法及MediaTracker類。
Toolkit類提供了兩個getImage()方法來載入圖片:
①Image getImage(URL url);
②Image getImage(String filename);
Toolkit是一個元件類,取得Toolkit的方法是:
Toolkit toolkit = Toolkit.getDefaultToolkit();
對於繼承了Frame的類來說,可以直接使用getToolkit()來獲取Toolkit物件;
Toolkit toolkit = getToolkit();
圖片的獲取:
Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image1 = toolkit.getImage("D:/Game/LinkGame/pic1.png");//載入D://Game//LinkGame路徑下的pic1.png圖片 Image image2 = toolkit.getImage(new URL("http://java.sun.com/graphics/people.gif"));
呼叫paint()方法中的Graphics物件可以很容易地顯示圖片,具體顯示需要呼叫Graphics類的drawImage()方法;
常用的圖片顯示方法如下:
①boolean drawImage(Image img,int x,int y,ImageObserver observer)://在(x,y)處顯示圖片
②boolean drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)://在(x,y)處顯示寬度為width高度為height的圖片,最常用。
引數中Image物件是用於顯示的圖片,(x,y)是圖片顯示的左上角座標,ImageObserver引數則是一個ImageObserver介面,它用來跟蹤圖片檔案是否已經裝載的情況,通常情況下我們都將其設定為this,即傳遞本物件的引用去實現這個介面。當影象陣列被載入的時候,它的實現會去呼叫repaint()方法。
將D盤路徑下的pic1.png圖片按原先的大小顯示在(100,200)處:
public void paint(Graphics g){
Image myImage = Toolkit.getDefaultToolkit.getImage("D:/pic1.png");//獲取圖片
g.drawImage(myImage,100,200,this);//在(100,200)處按原圖大小顯示圖片
}
將D盤路徑下的pic2.png圖片按寬度50畫素,高度50畫素的大小顯示(100,200)處:
public void paint(Graphics g){
Image myImage = Toolkit.getDefaultToolkit.getImage("D:/pic2.png");//獲取圖片
g.drawImage(myImage,100,200,50,50,this);//在(100,200)處按長50畫素寬、50畫素大小顯示圖片
}
有的時候,我們想要獲取圖片的一部分,這個時候需要對圖片進行一個裁剪操作;
在這裡,我使用BufferedImage類去獲取圖片物件,此類有一個getSubimage(int x,int y,int w,int h),作用是以(x,y)為裁剪圖片的左上角起點,裁剪一個寬度為w畫素,高度為h畫素的圖片;
將D盤路徑下的pic2.png圖片的左半部分進行裁剪:
BufferedImage bufferedImage = ImageIO.read(new File("D:/pic3.png"));
int width = bufferedImage.getWidth();//獲取原始圖片寬度
int height = bufferedImage.getHeight();//獲取原始圖片高度
Image myImage = bufferedImage.getSubimage(0, 0, width/2, height);//從左上角開始,裁剪左半邊圖片
//myImage是裁剪後的圖片物件
案例:顯示一張原始大小的圖片,一張指定大小的圖片,將一張圖片以3*3格式進行裁剪並在一行進行顯示;
說明:圖片要放置在D盤下,命名為pic.png,原始大小不能過大(否則不能將所有示例完全顯示)
博主這裡使用的圖片是:
MyPanel類:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class MyPanel extends JPanel{
public MyPanel(){
this.setPreferredSize(new Dimension(750,750));//設定面板大小
this.setVisible(true);
}
public void paint(Graphics g){
Image image = Toolkit.getDefaultToolkit().getImage("D:/pic.png");
g.drawImage(image, 50, 50, this);
g.drawImage(image, 600, 50, 150, 150, this);
BufferedImage bufferedImage = null;
int width = 0;
int height = 0;
try {
bufferedImage = ImageIO.read(new File("D:/pic.png"));//獲取圖片
width = bufferedImage.getWidth();//獲取圖片原始高度
height = bufferedImage.getHeight();//獲取圖片原始高度
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int w = width/3;//小圖片寬度
int h = height/3;//小圖片高度
Image[] pics = new Image[9];//儲存剪下後的圖片
for(int i=0;i<9;i++){//進行剪下
int x = i%3*w;
int y = i/3*h;
pics[i] = bufferedImage.getSubimage(x, y, w, h);
}
for(int i=0;i<9;i++){//展示圖片
g.drawImage(pics[i], 50+60*i, 600, 50, 50, this);
}
}
}
Client類:
import javax.swing.JFrame;
public class Client extends JFrame{
public Client(){
MyPanel panel = new MyPanel();
this.getContentPane().add(panel);//新增面板到內建面板
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//當用戶點選窗體右上角x時自動退出程式
pack();//自適應
setVisible(true);//展示窗體
setTitle("圖片案例");
setLocationRelativeTo(null);//讓視窗顯示在螢幕正中間
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Client();
}
}
執行結果:
後續補充:
使用帶透明通道的png格式的圖片有利於圖片顯示在背景之上,而不會覆蓋背景圖片;現在網上有很多線上摳圖工具,可以把圖片由jpg/png圖片變成帶透明通道的png圖片,博主經常使用的一個網站是:https://transparent.zhaoxi.net/