一些理论
RGB 颜色是红色、绿色和蓝色的组合:
(R、G、B)
红、绿、蓝各使用 8 位,整数值从 0 到 255。
所以可以生成的颜色数量为:
256×256×256 = 16777216 = 100000016
十六进制颜色代码是一个 6 位十六进制(以 16 为基数)数字:
RRGGBB16
左2位代表红色。
中间的 2 个数字代表绿色。
右边 2 个数字代表蓝色。
RGB 到十六进制转换
将红色、绿色和蓝色的颜色值从十进制转换为十六进制。
将红色、绿色和蓝色的 3 个十六进制值连接在一起:RRGGBB。
示例 #1
将红色 (255,0,0) 转换为十六进制颜色代码:
R = 25510 = FF16
G = 010 = 0016
B = 010 = 0016
所以十六进制颜色代码是:
Hex = FF0000
示例 #2
将金色 (255,215,0) 转换为十六进制颜色代码:
R = 25510 = FF16
G = 21510 = D716
B = 010 = 0016
所以十六进制颜色代码是:
Hex = FFD700
在 Android\Java 中:
import java.awt.Color;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RGBHexInterConverter {
static String commaSeparatedRGBPattern = "^(\\d{3}),(\\d{3}),(\\d{3})$";
static final int HEXLENGTH = 8;
static final String hexaDecimalPattern = "^0x([\\da-fA-F]{1,8})$";
public static void main(String[] args) {
/** Some sample RGB and HEX Values for Conversion */
String RGBForHexConversion = "128,128,255";
String hexForRGBConversion = "0x0077c8d2";
/** Convert from RGB to HEX */
covertRGBToHex(RGBForHexConversion);
/** Convert from HEX to RGB */
convertHexToRGB(hexForRGBConversion);
/**Pass some invalid RGB value for Hex Conversion*/
covertRGBToHex("3002,4001,5301");
/**Pass some invalid HEX value for RGB Conversion*/
convertHexToRGB("5xY077c8d2");
}
/**
* @param hexForRGBConversion
* - hex value string for conveting to RGB format. Valid format
* is: 0xXXXXXXXX e.g. 0x0077c8d2
* @return comma separated rgb values in the format rrr,ggg, bbb e.g.
* "119,200,210"
*/
private static String convertHexToRGB(String hexForRGBConversion) {
System.out.println("...converting Hex to RGB");
String rgbValue = "";
Pattern hexPattern = Pattern.compile(hexaDecimalPattern);
Matcher hexMatcher = hexPattern.matcher(hexForRGBConversion);
if (hexMatcher.find()) {
int hexInt = Integer.valueOf(hexForRGBConversion.substring(2), 16)
.intValue();
int r = (hexInt & 0xFF0000) >> 16;
int g = (hexInt & 0xFF00) >> 8;
int b = (hexInt & 0xFF);
rgbValue = r + "," + g + "," + b;
System.out.println("Hex Value: " + hexForRGBConversion
+ "\nEquivalent RGB Value: " + rgbValue);
} else {
System.out.println("Not a valid Hex String: " + hexForRGBConversion
+ "\n>>>Please check your input string.");
}
System.out.println();
return rgbValue;
}
/**
* @param rgbForHexConversion
* - comma separated rgb values in the format rrr,ggg, bbb e.g.
* "119,200,210"
* @return equivalent hex in the format 0xXXXXXXXX e.g. 0x0077c8d2
*
* If the converted hex value is not 8 characters long, pads the
* zeros in the front.
*/
private static String covertRGBToHex(String rgbForHexConversion) {
System.out.println("...converting RGB to Hex");
String hexValue = "";
Pattern rgbPattern = Pattern.compile(commaSeparatedRGBPattern);
Matcher rgbMatcher = rgbPattern.matcher(rgbForHexConversion);
int red;
int green;
int blue;
if (rgbMatcher.find()) {
red = Integer.parseInt(rgbMatcher.group(1));
green = Integer.parseInt(rgbMatcher.group(2));
blue = Integer.parseInt(rgbMatcher.group(3));
Color color = new Color(red, green, blue);
hexValue = Integer.toHexString(color.getRGB() & 0x00ffffff);
int numberOfZeroesNeededForPadding = HEXLENGTH - hexValue.length();
String zeroPads = "";
for (int i = 0; i < numberOfZeroesNeededForPadding; i++) {
zeroPads += "0";
}
hexValue = "0x" + zeroPads + hexValue;
System.out.println("RGB value: " + rgbForHexConversion
+ "\nEquivalent Hex Value: " + hexValue);
} else {
System.out.println("Not a valid RGB String: "+rgbForHexConversion
+ "\n>>>Please check your inut string.");
}
System.out.println();
return hexValue;
}
}