¿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

6 Solutions collect form web for “¿Qué algoritmo de mezcla de color se utiliza para oscurecer un color?”

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

  • No se puede encontrar el GETTER para el atributo 'app: vm' con el tipo de valor Boolean
  • La orientación de la vista previa en el modo horizontal se gira en el sentido de las agujas del reloj con Camera2 api
  • Trayecto de bola de dibujo de Android
  • Cómo matar un hilo en Android?
  • ¿Comprueba si el dispositivo Android recibe video de 4K?
  • ¿Por qué utilizar Retrofit cuando tenemos OkHttp
  • Dynamic Spinners - si se selecciona un elemento de un hilandero, ocúltalo de otros hiladores - Android
  • ¿Están garantizadas las variables globales de java para inicializarse primero?
  • el enlace de datos; la etiqueta de la vista no es correcta, Android
  • Directorio de verificación de archivos zip de Java
  • ENOENT (ningún archivo o directorio) cuando hay un archivo allí
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.