一、处理火柴人图片
在此之前,我们已经绘画好了所有的火柴人。但是我们要想实现火柴人跳舞,还需要将图片进行最后一次处理。就是保留红色的火柴人部分,其余的全部都处理成白色。这一点的原理和实现步骤二中一样的,只是颜色值需要改一下。
代码实现:
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();
}
}
}
到此,我们的这个程序,就算是全部写完了。