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/