¿Qué algoritmo de mezcla de color se utiliza para oscurecer un color?

Tengo estas tarjetas que tienen dos tonos de color en ellos. Un color principal, y luego un color de acento más oscuro:

El color principal se me da en hex, pero no el acento. ¿Puedes decir qué tipo de mezcla o transformación se está haciendo al ARGB del color principal para obtener el color de acento más oscuro?

Si importa, estoy desarrollando contra Android por lo que tengo acceso a la clase de color y ColorFilter para poder aplicar todo lo que PorterDuff cosas …

Introduzca aquí la descripción de la imagen

Si desea un Color más oscuro, puede:

  1. Convierta su RGB a HSV con RGBToHSV() .
  2. Reduzca V (valor de luminosidad). Es hsv[2] , un flotador con un valor de 0 a 1.
  3. Convierta HSV a Color con HSVToColor() .

Si desea un Bitmap más oscuro, PorterDuff.Mode.DARKEN debería funcionar. Sólo tiene que calibrar el valor COLOR :

 private Bitmap getDarkerBitmap(Bitmap src) { final int COLOR = 0xAAFFFFFF; final int WIDTH = src.getWidth(); final int HEIGHT = src.getHeight(); final Bitmap result = Bitmap.createBitmap(WIDTH, HEIGHT, src.getConfig()); final BitmapDrawable drawable = new BitmapDrawable(src); drawable.setBounds(0, 0, WIDTH, HEIGHT); drawable.setColorFilter(COLOR, PorterDuff.Mode.DARKEN); drawable.draw(new Canvas(result)); return result; } 

Simplemente haga esto:

 int color = .... int r = Color.red(color); int b = Color.blue(color); int g = Color.green(color); int darkerColor = Color.rgb((int)(r*.9), (int)(g*.9), (int)(b*.9)); 

Usando este código, donde si el factor <1, ​​el color del resultado será más oscuro y si el factor> 1, el color del resultado será más claro.

 public static int alterColor(int color, float factor) { int a = (color & (0xFF << 24)) >> 24; int r = (int) (((color & (0xFF << 16)) >> 16) * factor); int g = (int) (((color & (0xFF << 8)) >> 8) * factor); int b = (int) ((color & 0xFF) * factor); return Color.argb(a, r, g, b); } 

java.awt.Color.darker() multiplica cada 0-255 componente (R, G, B) con 0.7 y luego lo devuelve a int .

Para oscurecer un color, sólo tiene que quitar la misma cantidad de los componentes rojo verde y azul.

Edit: Puesto que usted está consiguiendo el color de un valor hexadecimal, usted necesita separar los componentes de él, disminuir su valor y ponerlo detrás adentro.

0xaarrggbb -> a = alfa r = rojo g = verde b = azul

 int color = 0xff445566; // Get the color component: int alpha |= a << 24; int red |= r << 16; int green |= g << 8; int blue |= b; int newalpha = alpha; int newred = red - proportional amount ; int newgreen = green - proportional amount ; int newblue = blue - proportional amount ; // Set the color component color = (color & ~(0xFF << 24)) | (newalpha << 24); color = (color & ~(0xFF << 16)) | (newred << 16); color = (color & ~(0xFF << 8)) | (newgreen << 8); color = (color & ~0xFF) | newblue; 

Echo un vistazo a las respuestas proporcionadas. Son impresionantes. Pero aquí hay otra forma de oscurecer un color int en Android. Como sigue:

  1. Convierta el RGB de su color a HSV usando el método RGBToHSV()
  2. Reduzca V (valor de luminosidad) utilizando un factor de flotación. Está en hsv[2] y un número del flotador se extiende de 0 a 1.
  3. Convierta HSV a Color usando el método HSVToColor() y luego vuelva

Este es el fragmento:

 public static int getDarkerColor(int color, float factor) { float[] hsv = new float[3]; Color.RGBToHSV(Color.red(color), Color.green(color), Color.blue(color), hsv); hsv[2] = hsv[2] * factor; return Color.HSVToColor(hsv); } 

Tenga en cuenta que cuando se da el factor 0.9f, se desea oscurecer el color de entrada a una velocidad del 10% ((1-0.9) * 100).

  • Obtenga día, mes y año por separado usando SimpleDateFormat
  • ¿Hay un convertidor de Java 7 a Java 6?
  • ¿Cómo mostrar los datos como barra de progreso y círculo de progresión del porcentaje de rueda?
  • Android: detectar el brillo (cantidad de luz) en el entorno del teléfono con la cámara?
  • Android: mover los botones libremente en el editor de diseño gráfico de Eclipse
  • Phonegap CLI con Java 8
  • Android: Cómo llamar a getActivity () en OnItemClickListener ()?
  • FileNotFoundException al llamar a webservice
  • HttpURLConnection de Android y URL con caracteres especiales
  • El temporizador Android llega tarde cuando la pantalla del teléfono está bloqueada
  • Objeto de interfaz de usuario creado a través de XML no se está barajando en Android Marshmallow
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.