我怎样才能得到一个图像的平均颜色

我希望能够拍摄图像,找出平均颜色。 这意味着如果图像是半黑半白,我会得到一些灰色的阴影。 这可能是最常见的单色或中位数。 任何平均将做。

我怎么能在android中做到这一点。

Solutions Collecting From Web of "我怎样才能得到一个图像的平均颜色"

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

我认为你必须自己做。

只需要用所有的颜色创build一个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颜色值)。

编辑:简单的解决scheme:

 Get you full-size image in a bitmap. Create a scaled bitmap of 1*1px. Get this bitmap color. 

构build丹O的解决scheme,这是一个自动考虑阿尔法通道的方法,并进行了getPixelsgetPixel的优化/折衷。

成本是内存,但好处是性能,可能会运行数百万次(即一个8MP图像有3,456×2304 = 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); } 

因为最近可以使用v7-palette库中的Palete类。

使用Bitmap.getPixels()方法来获取颜色值。 然后计算平均值,你必须决定你的意思。 在灰度图像中很简单,但是颜色不存在平均值。 您可以分成组件(例如RGBA),并取每个组件的平均值。 另一种方法是search最常用的颜色,我确定还有其他几个选项。 玩它:)