Solución:
Bitmap bitmap = someFunctionReturningABitmap();
long redBucket = 0;
long greenBucket = 0;
long blueBucket = 0;
long pixelCount = 0;
for (int y = 0; y < bitmap.getHeight(); y++)
{
for (int x = 0; x < bitmap.getWidth(); x++)
{
Color c = bitmap.getPixel(x, y);
pixelCount++;
redBucket += Color.red(c);
greenBucket += Color.green(c);
blueBucket += Color.blue(c);
// does alpha matter?
}
}
Color averageColor = Color.rgb(redBucket / pixelCount,
greenBucket / pixelCount,
blueBucket / pixelCount);
Creo que tendrás que hacerlo tú mismo.
Simplemente crea una matriz int con todos los colores:
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
bmp = bmp.copy(Bitmap.Config.ARGB_8888, true);
int intArray[] = new int[bmp.getWidth()*bmp.getHeight()];
bmp.getPixels(intArray, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight());
Entonces puedes obtener el color con intArray[0], el valor podría ser 0xFFFF0000 para rojo (los últimos 6 números son el valor de color RGB).
EDITAR: Solución fácil:
Get you full-size image in a bitmap.
Create a scaled bitmap of 1*1px.
Get this bitmap color.
Partiendo de la solución de Dan O, aquí hay un método que toma en cuenta automáticamente el canal alfa y hace la optimización / compensación de getPixels
vs getPixel
.
El costo es la memoria, pero el beneficio es el rendimiento, la invocación de un método virtual en un bucle que posiblemente podría ejecutarse varios millones de veces. [i.e. an 8MP image has 3,456×2,304 = 7,962,624 pixels]). Incluso he ido un paso más allá al eliminar el bucle android.graphics.Color
llamadas a métodos.
public static int getDominantColor(Bitmap bitmap) {
if (null == bitmap) return Color.TRANSPARENT;
int redBucket = 0;
int greenBucket = 0;
int blueBucket = 0;
int alphaBucket = 0;
boolean hasAlpha = bitmap.hasAlpha();
int pixelCount = bitmap.getWidth() * bitmap.getHeight();
int[] pixels = new int[pixelCount];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
for (int y = 0, h = bitmap.getHeight(); y < h; y++)
{
for (int x = 0, w = bitmap.getWidth(); x < w; x++)
{
int color = pixels[x + y * w]; // x + y * width
redBucket += (color >> 16) & 0xFF; // Color.red
greenBucket += (color >> 8) & 0xFF; // Color.greed
blueBucket += (color & 0xFF); // Color.blue
if (hasAlpha) alphaBucket += (color >>> 24); // Color.alpha
}
}
return Color.argb(
(hasAlpha) ? (alphaBucket / pixelCount) : 255,
redBucket / pixelCount,
greenBucket / pixelCount,
blueBucket / pixelCount);
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)