《Java代码成精了——会跳萨日朗的火柴人》实现步骤二:处理图片背景颜色

在此之前,我们已经实现项目的第一步,就是读取视频文件,获取每一帧对应的图片。本小节要做的就是对这些原图片进行处理。因为我们绘画水平有限,我们希望在原图片的轮廓上进行绘画。但是原图片的颜色不太好,我们希望能够把背景变成白色,小人变成黑色。这样小人的轮廓就很清晰。(当然如果忽略本次操作,直接在原图上进行绘画,也是可以的。)

 

一、进制

首先我们要普及一下进制的数据。因为Java程序操作的颜色,往往是10进制的数值。但实际在表示颜色时候,一般会使用16进制的颜色值,或者rgb颜色值来表示。

进制关系

开发中可能会使用到进制
    十进制(Decimal)
    二进制(Binary)
    八进制(Octal,简写OCT)
    十六进制(Hexadecimal,简写HEX)

二、颜色

颜色的表示:红色,绿色,蓝色。

1、RGB(r,g,b)

0-255

rgb(0,0,0)黑色
rgb(255,255,255)白色
rgb(255,0,0)红色
rgb(0,255,0)绿色
rgb(0,0,255)蓝色


2、16进制颜色值

红,绿,蓝
​
#FF0000,红色
#00FF00,绿色
#0000FF,蓝色
#000000,黑色
#ffffff,白色

3、单词

red,红色
green,绿色
blue,蓝色
white,白色
black,黑色
pink,粉色

 

关于颜色有很多网站可以查看,比如:https://www.sioe.cn/yingyong/yanse-rgb-16/

以下截图展示部分颜色值:


三、代码实现

 

在上次课创建的项目里,新建一个java文件,命名为:D2_ChangeBack.java

示例代码:


package demo;
​
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
​
import javax.imageio.ImageIO;
​
/**
 * step2:项目第二部,将刚刚读取到的每一帧图片,处理颜色,背景是白色,小人黑色
 * @author ruby
 *
 */
public class D2_ChangeBack {
​
 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);
//     System.out.println(color);
     // 8将像素由整形数值,转为红绿蓝
     rgb[0] = (color & 0xff0000) >> 16;// 红色
     rgb[1] = (color & 0xff00) >> 8;// 绿色
     rgb[2] = (color & 0xff);// 蓝
     
     //9.判断颜色值,进行换色:白色,黑色
     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();
   }
  }
 }
​
}
​

 

因为上课需要和学生的操作系统,所以我在自己的mac电脑上安装了windows虚拟机。只有一个C盘。

在本地硬盘上:创建目录结构:C:\Ruby\萨日朗\换色。将程序执行后,该目录下有以下文件:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值