web-dev-qa-db-fra.com

Convertir la valeur de couleur entière en RVB

J'essaie de modifier un logiciel tiers. Je veux utiliser une couleur renvoyée par certaines méthodes (que je ne peux pas modifier) ​​comme entier. Cependant, je voudrais utiliser le format RVB, comme # FF00FF. Comment faire une conversion?

Voici un exemple HTML http://www.shodor.org/stella2Java/rgbint.html Je voudrais archiver la même chose en Java, sur Android.

24
Marek

Utilisez ceci

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));

Nous savons que la longueur de la valeur de couleur dans HEX est 6. Vous voyez donc 6 ici. % 06X correspond au résultat provenant de (0xFFFFFF & intColor) et si la longueur est inférieure à 6, il produit un résultat avec 6 en ajoutant ZERO au côté gauche du résultat. Et vous voyez #, donc ce # char est ajouté au résultat et enfin vous obtenez une valeur HEX COLOR.


Mise à jour depuis l'API 26

Depuis l'API 26, de nouvelles méthodes Color.valueOf(....) ont été introduites pour convertir les couleurs pour une raison similaire. vous pouvez l'utiliser comme

// sRGB
Color opaqueRed = Color.valueOf(0xffff0000); // from a color int
Color translucentRed = Color.valueOf(1.0f, 0.0f, 0.0f, 0.5f);

// Wide gamut color
ColorSpace sRgb = ColorSpace.get(ColorSpace.Named.SRGB);
@ColorLong long p3 = Color.pack(1.0f, 1.0f, 0.0f, 1.0f, sRgb);
Color opaqueYellow = Color.valueOf(p3); // from a color long

// CIE L*a*b* color space
ColorSpace lab = ColorSpace.get(Named.CIE_LAB);
Color green = Color.valueOf(100.0f, -128.0f, 128.0f, 1.0f, lab);

mView.setBackgroundColor(opaqueRed.toArgb());
mView2.setBackgroundColor(green.toArgb());
mView3.setBackgroundColor(translucentRed.toArgb());
mView4.setBackgroundColor(opaqueYellow.toArgb());
40
Pankaj Kumar

J'ai trouvé que la solution la plus simple et la meilleure pour moi était d'utiliser directement la classe Color comme suit:

int red = Color.red(intColor);
int green = Color.green(intColor);
int blue = Color.blue(intColor);
int alpha = Color.alpha(intColor);

De cette façon, je pouvais déjà gérer les valeurs entières sans avoir à gérer les chaînes. Si d'autre part la chaîne représentant la couleur RVB est ce dont vous avez besoin, la réponse de Pankaj Kumar est la meilleure. J'espère que cela est utile à quelqu'un.

65
Francesco D.M.

RVB utilise un format de nombre hexadécimal ,. si vous avez une valeur entière, convertissez int en hex ,.

1
simaremare

Depuis SDK 26 vous pouvez simplement utiliser

Color c = Color.valueOf(colorInt);

en dehors de cela, il ne semble pas possible de créer une instance Color à partir d'argb arbitraire. Le code sous-jacent utilise un constructeur privé:

/**
 * Creates a new <code>Color</code> instance from an ARGB color int.
 * The resulting color is in the {@link ColorSpace.Named#SRGB sRGB}
 * color space.
 *
 * @param color The ARGB color int to create a <code>Color</code> from
 * @return A non-null instance of {@link Color}
 */
@NonNull
public static Color valueOf(@ColorInt int color) {
    float r = ((color >> 16) & 0xff) / 255.0f;
    float g = ((color >>  8) & 0xff) / 255.0f;
    float b = ((color      ) & 0xff) / 255.0f;
    float a = ((color >> 24) & 0xff) / 255.0f;
    return new Color(r, g, b, a, ColorSpace.get(ColorSpace.Named.SRGB));
}
1
patrickf