Java 用于编码RGB值的位移位和按位操作

Java 用于编码RGB值的位移位和按位操作,java,bit-manipulation,Java,Bit Manipulation,我想将RGB颜色编码为单个整数值 假设编码的算法是这样的: int code = (blue * 256 * 256) + (green * 256) + red 如何使用位移位和/或位运算符在代码中对RGB组件进行编码/解码?int blueMask=0xFF0000,greenMask=0xFF00,redMask=0xFF; int blueMask = 0xFF0000, greenMask = 0xFF00, redMask = 0xFF; int r = 12, g

我想将RGB颜色编码为单个整数值

假设编码的算法是这样的:

int code = (blue * 256 * 256) + (green * 256) + red
如何使用位移位和/或位运算符在代码中对RGB组件进行编码/解码?

int blueMask=0xFF0000,greenMask=0xFF00,redMask=0xFF;
    int blueMask = 0xFF0000, greenMask = 0xFF00, redMask = 0xFF;
    int r = 12, g = 13, b = 14;
    int bgrValue = (b << 16) + (g << 8) + r;
    System.out.println("blue:" + ((bgrValue & blueMask) >> 16));
    System.out.println("red:" + ((bgrValue & redMask)));
    System.out.println("green:" + ((bgrValue & greenMask) >> 8));
int r=12,g=13,b=14; int bgrValue=(b 16)); System.out.println(“红色:”+((bgrValue和redMask)); System.out.println(“绿色:”+((bgrValue和greenMask)>>8));
如果您只是想/从RGB转换,而不关心我建议如何使用
java.awt.Color

int r = 255; //red
int g = 255; //green
int b = 255; //blue
int a = 255; //alpha
Color c = new Color(r,g,b,a);
使用方法和getRed、getBlue、getGreen方法

int RGB = c.getRGB();
int red = c.getRed();
int blue = c.getBlue();
int green = c.getGreen();
或者,您可以使用
color(r,g,b)
构造函数构造颜色对象,它将具有默认的255 alpha

使用位操作(ARGB,32位颜色空间)。构建RGB颜色:

int alpha = 255;    
int red = 128;
int green = 128;
int blue = 128;
int RGB = (alpha << 24);
RGB = RGB | (red << 16);
RGB = RGB | (green << 8);
RGB = RGB | (blue);

System.out.println(Integer.toBinaryString(RGB));
int alpha=255;
红色整数=128;
绿色整数=128;
int蓝色=128;

int RGB=(alpha这里有一个模拟程序,我已经完成了,它可能会帮助你。我处理转换的方式很像Dev Blanked根据我做的一个旧程序,但他在我整理程序的时候回答了。既然我做了这项工作,我想我会分享一下,以防它有任何帮助

import java.util.Scanner;
import java.math.*;

public class RGB{

public static void main(String[]args){
    Scanner scan = new Scanner(System.in);
    int code; //Code for the color
    int red, green, blue; //Individual colors
    int rMask = 0xFF0000, gMask = 0xFF00, bMask = 0xFF; //Masks for the colors

    //Take input
    System.out.println("Please enter the red color. Range [0, 255] only please.");
    red = scan.nextInt();
    System.out.println("Please enter the green color. Range [0, 255] only please.");
    green = scan.nextInt();
    System.out.println("Please enter the blue color. Range [0, 255] only please.");
    blue = scan.nextInt();

    //Generate code based on Behnil's way.
    code = 0;
    code += (int) (red * Math.pow(2, 16));
    code += (int) (green * Math.pow(2, 8));
    code += (int) (blue * Math.pow(2,0));
    System.out.println("The code is " + code + ".");

    //Clear values
    red = 0;
    green = 0;
    blue = 0;

    //Obtain values.
    red = (code & rMask) >> 16;
    green = (code & gMask) >> 8;
    blue = (code & bMask);

    System.out.println("Your red value is: " + red);
    System.out.println("Your green value is: " + green);
    System.out.println("Your blue value is: " + blue);      
}

}
这将按预期输出111222121。
这是我修复它的方式,但我不确定专业人士是否同意,因为它可能比使用位移位慢

第二个答案只是反转操作是的,但我的代码是24位,为什么我需要将每个组件乘以0x000000FF?因为alpha,整数是32位的,所以您可以将alpha部分设置为零。和h如何使用位移位将单个RGB组件编码为整数值?@Behnil use(r实际上,掩码是int blueMask=0xFF0000、greenMask=0xFF00、redMask=0xFF,移位16在蓝色分量上,而不是在红色分量上one@Behnil是的,你是正确的,我用它作为RGB,但我看到你原来的问题用它作为BGR,但可能是它作为RGB更好,这是大多数人所说的是的,如果我可以使用RGB,我会使用但是我必须使用BGR,因为这就是我连接到的RDBMS中存储数据的方式。
public static void main(String[] args){
    int red = 111;
    int green = 222;
    int blue = 121;

    int code = red*256*256 + green*256 + blue;

    blue = code%256;
    green = (code%(256*256) - blue)/256;
    red = (code - blue - green*256)/(256*256); 

    System.out.println("" + red + green + blue);
}