位移和按位运算可对RGB值进行编码

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

假设编码算法是这样的:

int code = (blue * 256 * 256) + (green * 256) + red 

如何使用位移和/或按位运算符对代码中的RGB组件进行编码/解码?

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

如果您只想进行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); 

使用getRGB方法和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)); 

11111111100000001000000010000000

解码按照注释中的链接完成。

这是一个我做过的模拟程序,可以帮助你。 我接下来的转换很像基于我做过的旧程序的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); } } 
 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); } 

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