《Java代码成精了——会跳萨日朗的火柴人》实现步骤四:火柴人跳舞(完)

一、处理火柴人图片

在此之前,我们已经绘画好了所有的火柴人。但是我们要想实现火柴人跳舞,还需要将图片进行最后一次处理。就是保留红色的火柴人部分,其余的全部都处理成白色。这一点的原理和实现步骤二中一样的,只是颜色值需要改一下。

代码实现:

package demo;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

/**
 * 读取刚刚绘画好的每一张图片,处理颜色,红色火柴人,白色背景
 * @author ruby
 *
 */
public class D4_ChangeBack2 {

	public static void main(String[] args) {
		//1.要处理的图片的目录路径
		String dirPath = "C:\\Ruby\\萨日朗\\绘图";
		//2.处理后的图片,要存储的目录
		String changePath = "C:\\Ruby\\萨日朗\\绘图_\\";
		
		File dir = new File(dirPath);
		//3.获取图片目录下所有的图片文件
		File[] files = dir.listFiles();
		System.out.println(files.length);
		//4.遍历这个文件数组,操作每一张图片
		for(int x = 0;x <files.length;x++){
			System.out.println(files[x].getAbsolutePath());
			//用来处理图片的对象
			BufferedImage image = null;
			try {
				//5.将每一张图片,都读到程序中。
				image = ImageIO.read(files[x]);
			} catch (IOException e) {
				e.printStackTrace();
			}
			//6.获取图片的宽度和高度
			int width = image.getWidth();
			int height = image.getHeight();
			//定义一个rgb的数组,表示颜色,因为图片的rgb模式,是由3个0-255的数来表示的,比如白色(255,255,255)
			int[] rgb = new int[3];
			//7.遍历图片中的每一个像素点
			for(int i=0;i<width;i++){
				for(int j=0;j<height;j++){
					int color = image.getRGB(i, j);//10进制的颜色值
//					System.out.println(color);
					// 8将像素由整形数值,转为红绿蓝
					rgb[0] = (color & 0xff0000) >> 16;// 红色
					rgb[1] = (color & 0xff00) >> 8;// 绿色
					rgb[2] = (color & 0xff);// 蓝
					
					//9.判断颜色值,进行换色:白色,黑色
					if(rgb[0] > 200 && rgb[1] < 100&& rgb[2] < 100){ // #ff0000 ,rgb(255,0,0);
						//替换成红色
						image.setRGB(i, j, 0xff0000);
						
					}else{
						//否则替换成白色
						image.setRGB(i, j, 0xffffff);//白色
					}
//					if(rgb[0] < 140 && rgb[1] < 130 && rgb[2]<120){
//						image.setRGB(i, j, 0x000000);//黑色
//					}else{
//						image.setRGB(i, j, 0xffffff);//白色
//					}
				}
			}
			//10.将换色后的图片数据,保存到目标文件夹里
			File newFile = new File(changePath+files[x].getName());
			System.out.println(newFile.getAbsolutePath());
			try {
				ImageIO.write(image, "jpg", newFile);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

先在萨日朗目录下,新建一个绘图_文件夹,用于保存颜色处理后的图片。到此,火柴人算是真正的绘制完毕。在绘图_目录下,就有了这些火柴人图片。

二、火柴人跳舞

到此,图片准备完毕。我们需要在萨日朗目录下,准备一个mp3音乐文件。

火柴人跳舞的思路:

启动一个子线程,播放音乐。再另一个线程中,连续在图形界面上显示图片。

播放音乐,需要使用mp3的jar包:jl1.0.jar

然后新建一个java的源文件,编写代码:

package demo;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class D5_DancePicture {

	public static void main(String[] args) {
		//播放音乐
		MusicThread t1 = new MusicThread();
		t1.start();
		
		PictureJFrame frame = new PictureJFrame();
		frame.setSize(500,723);
		frame.setTitle("火红的萨日朗");
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
	}
	

}

class PictureJFrame extends JFrame{
	@Override
	public void paint(Graphics g) {
//		String imagePath = "C:\\Ruby\\萨日朗\\换图_\\";
		for(int i=0;i<=470;i++){
			try {
				Thread.sleep(20);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			File file = new File("C:\\Ruby\\萨日朗\\换色_\\"+i+".jpg");
			System.out.println(file.getAbsolutePath());
			System.out.println(file.exists());
			if(!file.exists()){
				continue;
			}
			try {
				BufferedImage image = ImageIO.read(file);
				g.drawImage(image.getScaledInstance(500, 723, Image.SCALE_DEFAULT), 0, 0,500,723,null);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

class MusicThread extends Thread{
	@Override
	public void run() {
		//继承线程类后,重写run方法,播放音乐的代码
		//1.创建音频文件对象
		String musicPath = "C:\\Ruby\\萨日朗\\火红的萨日朗.mp3";
		File file = new File(musicPath);
		try {
			//2.使用IO流读取音频文件数据
			FileInputStream fis = new FileInputStream(file);
			//外套缓存流,高效
			BufferedInputStream bis = new BufferedInputStream(fis);
			Player player = new Player(bis);
			player.play();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (JavaLayerException e) {
			e.printStackTrace();
		}

	}
}

 

到此,我们的这个程序,就算是全部写完了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值