24位真彩色的一种颜色由(红、绿、蓝)三元色值组成,称为RGB值,采用1字节存储一种单色值,范围是0~255;用一个int整数存储一种颜色,结构为:最高字节全为1,其后3字节分别存储红、绿、蓝三元色值,RGB整数结构如图3-17所示,0xff0000ff表示蓝色,RGB值为(0,0,255).
本蒟蒻由于迷恋算法,大一上到现在JAVA其实没有跟上,封装继承用的不是很熟练,还请各位高台贵手.
核心是怎样取出red、green、blue三个参数的最低字节中存储的颜色信息,并将三个字节的信息合并到一个int型的整数。
思路:其实取这个操作很简单,你规定只能输入0-255的数字不就是只占用了一个字节嘛,当然我就懒得写了在代码中。主要说一下如何合并:首先我们引出&运算符,下面给出定义:
按位与运算符(&)
按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:
0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
那么我们如何操作呢:
对于Blue:由于他的输入和本来就位置就在最后1个字节,不用动
对于Green:我们可以先让他左移<<8,那么就是对应的2进制位向移了8个byte
同理Red:<< 16;
那么问题来了,最高位一个字节的全是1怎么弄呢?很简单,我们让一个数最低为都是1,然后<<24个byte就好了,对应的数就是255
那么如果给你一个RGB值,我们如何得到Red,Green,Blue呢
Blue = RGB & 255,因为前面的3个字节都是0,所以&出来也是0,对于最后1个字节的8个Byte,是1就是1,不是1&出来就是0;
那么Green和Red也是同理,下面看代码
package test329;
import java.util.*;
public class Color {
private int value;
int red, green, blue;
public Color(int red, int green, int blue) {//两种构造方法
this.set(red, green, blue);
this.value = blue + (green << 8) + (red << 16) + (255 << 24);//255向左移动三个字节就是11111111
}
public Color(int rgb) {
this.value = rgb;
this.set(rgb);
}
//按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:
// 0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
public void set(int rgb) {//如果给出了rgb的话
this.blue = this.value & 255;//由于255前三个字节都是0,所以前面都是0,只要看最后一个字节的8位&的结果
this.green = (this.value & (255 << 8)) >> 8;//先得到第二个字节&的结果,然后将这个字节8byte全部右移
this.red = (this.value & (255 << 16)) >> 16;//同上
}
public void set(int red, int green, int blue) {//set方法,简单重载
this.red = red;
this.green = green;
this.blue = blue;
}
public String getRGB() {
return Integer.toHexString(this.value);//toHexString(int i)
//以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。
}
public int getRed() {
return this.red;
}
public int getGreen() {
return this.green;
}
public int getBlue() {
return this.blue;
}
public String toString() {
return "( red , green , blue ) == ( " + this.red + " , " + this.green + " , " + this.blue + " )";
}
}
class Main {
public static void main(String[] args) {
//final int MIN = -16777216;
Scanner sc = new Scanner(System.in);
int MAX = (255 << 24) + (255 << 16) + (255 << 8) + 255;//int的最大值
System.out.println("请输入红,绿,蓝三种颜色");
System.out.println("( 0<=value <=255 ) :");
Color a = new Color(sc.nextInt(), sc.nextInt(), sc.nextInt());//给出三色构造
System.out.println("RGB = 0x" + a.getRGB());//16字节表示
System.out.println("Red = " + a.getRed());
System.out.println("Green = " + a.getGreen());
System.out.println("Blue = " + a.getBlue());
System.out.println("-----------------");
System.out.println(a.toString());
System.out.println("请输入一个RGB的值");
Color b = new Color(sc.nextInt());//给出rgb构造
System.out.println("RGB = 0x" + b.getRGB());//16字节表示
System.out.println("Red = " + b.getRed());
System.out.println("Green = " + b.getGreen());
System.out.println("Blue = " + b.getBlue());
System.out.println("-----------------");
System.out.println(b.toString());
}
}