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,原始大小不能过大(否则不能将所有示例完全显示)

博主这里使用的图片是:GUI编程基础学习(五)——图片的获取、显示及裁剪_第1张图片

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

}

运行结果:

GUI编程基础学习(五)——图片的获取、显示及裁剪_第2张图片

后续补充:

使用带透明通道的png格式的图片有利于图片显示在背景之上,而不会覆盖背景图片;现在网上有很多在线抠图工具,可以把图片由jpg/png图片变成带透明通道的png图片,博主经常使用的一个网站是:https://transparent.zhaoxi.net/

你可能感兴趣的:(Java基础,游戏开发基础,游戏开发基础)