3-36 声明颜色类

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


    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值