我希望能够拍摄图像并找出平均颜色。意思是如果图像是半黑半白,我会得到介于两者之间的东西......有些灰色。它可能是最常见的单色或中值。任何平均值都可以。
我怎么能在android中做到这一点。
答案 0 :(得分:42)
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);
答案 1 :(得分:11)
我认为你必须自己做。
只需创建一个包含所有颜色的int数组:
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());
然后你可以用intArray [0]获得颜色,红色的值可以是0xFFFF0000(最后6个数字是RGB颜色值)。
编辑: 简单的解决方案:
Get you full-size image in a bitmap.
Create a scaled bitmap of 1*1px.
Get this bitmap color.
答案 2 :(得分:8)
建立Dan O的解决方案,这是一种自动考虑alpha通道并对getPixels
vs getPixel
进行优化/权衡的方法。
成本是内存,但好处是性能,在循环中调用虚拟方法可能会运行数百万次[即一个800万像素的图像有3,456x2,304 = 7,962,624像素])。我甚至通过删除循环的android.graphics.Color
方法调用来进一步采取行动。
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);
}
答案 3 :(得分:7)
您可以使用AndroidX中的Palete
课程,也可以使用v7-support library中的课程。
它提供了从Bitmap中提取颜色的其他方法,例如获取:
答案 4 :(得分:2)
使用Bitmap.getPixels()
方法获取颜色值。然后计算平均值,你必须决定你的意思。在灰度图像中它很简单,但是颜色没有平均值。您可以分成组件(例如RGBA),并获取每个组件的平均值。另一种方法是搜索最常用的颜色,我确定还有其他几种选择。玩它吧:)
答案 5 :(得分:2)