Dla tych, którzy chcą również wersję 3-znakową, zauważ, że w przypadku 3 znaków każda wartość musi być * 255 / 16. Przetestowałem to z "000", "aaa" i "fff" i wszystkie teraz działają poprawnie .
Andrew,
287
W rzeczywistości istnieje łatwiejszy (wbudowany) sposób na zrobienie tego:
Color.parseColor nie obsługuje kolorów z trzema cyframi, takimi jak ta: #fff
neoexpert
Możesz spróbować poniżej #fff int red = colorString.charAt (1) == '0'? 0: 255; int blue = colorString.charAt (2) == '0'? 0: 255; int green = colorString.charAt (3) == '0'? 0: 255; Color.rgb (czerwony, zielony, niebieski);
GTID
10
Oto wersja obsługująca wersje RGB i RGBA:
/**
* Converts a hex string to a color. If it can't be converted null is returned.
* @param hex (i.e. #CCCCCCFF or CCCCCC)
* @return Color
*/publicstatic Color HexToColor(String hex){
hex = hex.replace("#", "");
switch (hex.length()) {
case6:
returnnew Color(
Integer.valueOf(hex.substring(0, 2), 16),
Integer.valueOf(hex.substring(2, 4), 16),
Integer.valueOf(hex.substring(4, 6), 16));
case8:
returnnew Color(
Integer.valueOf(hex.substring(0, 2), 16),
Integer.valueOf(hex.substring(2, 4), 16),
Integer.valueOf(hex.substring(4, 6), 16),
Integer.valueOf(hex.substring(6, 8), 16));
}
returnnull;
}
Przekonwertuj go na liczbę całkowitą, a następnie podziel dwukrotnie na 16, 256, 4096 lub 65536 w zależności od długości oryginalnego ciągu szesnastkowego (odpowiednio 3, 6, 9 lub 12).
Oto kolejna szybsza wersja, która obsługuje wersje RGBA:
publicstaticinthexToIntColor(String hex){
int Alpha = Integer.valueOf(hex.substring(0, 2), 16);
int Red = Integer.valueOf(hex.substring(2, 4), 16);
int Green = Integer.valueOf(hex.substring(4, 6), 16);
int Blue = Integer.valueOf(hex.substring(6, 8), 16);
Alpha = (Alpha << 24) & 0xFF000000;
Red = (Red << 16) & 0x00FF0000;
Green = (Green << 8) & 0x0000FF00;
Blue = Blue & 0x000000FF;
return Alpha | Red | Green | Blue;
}
Odpowiedzi:
Myślę, że powinno to wystarczyć:
/** * * @param colorStr e.g. "#FFFFFF" * @return */ public static Color hex2Rgb(String colorStr) { return new Color( Integer.valueOf( colorStr.substring( 1, 3 ), 16 ), Integer.valueOf( colorStr.substring( 3, 5 ), 16 ), Integer.valueOf( colorStr.substring( 5, 7 ), 16 ) ); }
źródło
W rzeczywistości istnieje łatwiejszy (wbudowany) sposób na zrobienie tego:
Color.decode("#FFCCEE");
źródło
public static void main(String[] args) { int hex = 0x123456; int r = (hex & 0xFF0000) >> 16; int g = (hex & 0xFF00) >> 8; int b = (hex & 0xFF); }
źródło
Do programowania na Androida używam:
int color = Color.parseColor("#123456");
źródło
Oto wersja obsługująca wersje RGB i RGBA:
/** * Converts a hex string to a color. If it can't be converted null is returned. * @param hex (i.e. #CCCCCCFF or CCCCCC) * @return Color */ public static Color HexToColor(String hex) { hex = hex.replace("#", ""); switch (hex.length()) { case 6: return new Color( Integer.valueOf(hex.substring(0, 2), 16), Integer.valueOf(hex.substring(2, 4), 16), Integer.valueOf(hex.substring(4, 6), 16)); case 8: return new Color( Integer.valueOf(hex.substring(0, 2), 16), Integer.valueOf(hex.substring(2, 4), 16), Integer.valueOf(hex.substring(4, 6), 16), Integer.valueOf(hex.substring(6, 8), 16)); } return null; }
źródło
Kolor szesnastkowy to #RRGGBB
RR, GG, BB to wartości szesnastkowe z zakresu od 0 do 255
Nazwijmy RR XY, gdzie X i Y są znakami szesnastkowymi 0-9A-F, A = 10, F = 15
Wartość dziesiętna to X * 16 + Y
Jeśli RR = B7, liczba dziesiętna dla B wynosi 11, więc wartość wynosi 11 * 16 + 7 = 183
public int[] getRGB(String rgb){ int[] ret = new int[3]; for(int i=0; i<3; i++){ ret[i] = hexToInt(rgb.charAt(i*2), rgb.charAt(i*2+1)); } return ret; } public int hexToInt(char a, char b){ int x = a < 65 ? a-48 : a-55; int y = b < 65 ? b-48 : b-55; return x*16+y; }
źródło
możesz to zrobić po prostu jak poniżej:
public static int[] getRGB(final String rgb) { final int[] ret = new int[3]; for (int i = 0; i < 3; i++) { ret[i] = Integer.parseInt(rgb.substring(i * 2, i * 2 + 2), 16); } return ret; }
Na przykład
getRGB("444444") = 68,68,68 getRGB("FFFFFF") = 255,255,255
źródło
W przypadku JavaFX
import javafx.scene.paint.Color;
.
Color whiteColor = Color.valueOf("#ffffff");
źródło
Przekonwertuj go na liczbę całkowitą, a następnie podziel dwukrotnie na 16, 256, 4096 lub 65536 w zależności od długości oryginalnego ciągu szesnastkowego (odpowiednio 3, 6, 9 lub 12).
źródło
Wiele z tych rozwiązań działa, ale to jest alternatywa.
String hex="#00FF00"; // green long thisCol=Long.decode(hex)+4278190080L; int useColour=(int)thisCol;
Jeśli nie dodasz 4278190080 (# FF000000), kolor ma wartość alfa równą 0 i nie będzie wyświetlany.
źródło
Aby rozwinąć odpowiedź podaną @xhh, możesz dołączyć czerwony, zielony i niebieski, aby sformatować swój ciąg jako „rgb (0,0,0)” przed jego zwróceniem.
/** * * @param colorStr e.g. "#FFFFFF" * @return String - formatted "rgb(0,0,0)" */ public static String hex2Rgb(String colorStr) { Color c = new Color( Integer.valueOf(hexString.substring(1, 3), 16), Integer.valueOf(hexString.substring(3, 5), 16), Integer.valueOf(hexString.substring(5, 7), 16)); StringBuffer sb = new StringBuffer(); sb.append("rgb("); sb.append(c.getRed()); sb.append(","); sb.append(c.getGreen()); sb.append(","); sb.append(c.getBlue()); sb.append(")"); return sb.toString(); }
źródło
Jeśli nie chcesz używać AWT Color.decode, po prostu skopiuj zawartość metody:
int i = Integer.decode("#FFFFFF"); int[] rgb = new int[]{(i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF};
Integer.decode obsługuje # lub 0x, w zależności od tego, jak sformatowany jest ciąg
źródło
Oto kolejna szybsza wersja, która obsługuje wersje RGBA:
public static int hexToIntColor(String hex){ int Alpha = Integer.valueOf(hex.substring(0, 2), 16); int Red = Integer.valueOf(hex.substring(2, 4), 16); int Green = Integer.valueOf(hex.substring(4, 6), 16); int Blue = Integer.valueOf(hex.substring(6, 8), 16); Alpha = (Alpha << 24) & 0xFF000000; Red = (Red << 16) & 0x00FF0000; Green = (Green << 8) & 0x0000FF00; Blue = Blue & 0x000000FF; return Alpha | Red | Green | Blue; }
źródło
Najłatwiejszy sposób:
// 0000FF public static Color hex2Rgb(String colorStr) { return new Color(Integer.valueOf(colorStr, 16)); }
źródło
Dla użytkowników Androida Kotlin :
"#FFF".longARGB()?.let{ Color.parceColor(it) } "#FFFF".longARGB()?.let{ Color.parceColor(it) }
fun String?.longARGB(): String? { if (this == null || !startsWith("#")) return null // #RRGGBB or #AARRGGBB if (length == 7 || length == 9) return this // #RGB or #ARGB if (length in 4..5) { val rgb = "#${this[1]}${this[1]}${this[2]}${this[2]}${this[3]}${this[3]}" if (length == 5) { return "$rgb${this[4]}${this[4]}" } return rgb } return null }
źródło
Szesnastkowe kody kolorów są już w formacie rgb. Format to #RRGGBB
źródło
Któregoś dnia rozwiązałem podobny problem i okazało się, że wygodnie jest przekonwertować ciąg koloru szesnastkowego na int array [alpha, r, g, b]:
/** * Hex color string to int[] array converter * * @param hexARGB should be color hex string: #AARRGGBB or #RRGGBB * @return int[] array: [alpha, r, g, b] * @throws IllegalArgumentException */ public static int[] hexStringToARGB(String hexARGB) throws IllegalArgumentException { if (!hexARGB.startsWith("#") || !(hexARGB.length() == 7 || hexARGB.length() == 9)) { throw new IllegalArgumentException("Hex color string is incorrect!"); } int[] intARGB = new int[4]; if (hexARGB.length() == 9) { intARGB[0] = Integer.valueOf(hexARGB.substring(1, 3), 16); // alpha intARGB[1] = Integer.valueOf(hexARGB.substring(3, 5), 16); // red intARGB[2] = Integer.valueOf(hexARGB.substring(5, 7), 16); // green intARGB[3] = Integer.valueOf(hexARGB.substring(7), 16); // blue } else hexStringToARGB("#FF" + hexARGB.substring(1)); return intARGB; }
źródło
For shortened hex code like #fff or #000 int red = "colorString".charAt(1) == '0' ? 0 : "colorString".charAt(1) == 'f' ? 255 : 228; int green = "colorString".charAt(2) == '0' ? 0 : "colorString".charAt(2) == 'f' ? 255 : 228; int blue = "colorString".charAt(3) == '0' ? 0 : "colorString".charAt(3) == 'f' ? 255 : 228; Color.rgb(red, green,blue);
źródło