首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得图像的平均颜色?

如何获得图像的平均颜色?
EN

Stack Overflow用户
提问于 2012-09-13 22:19:52
回答 6查看 40.4K关注 0票数 42

我希望能够拍摄一张图像,并找出平均颜色是什么。意思是如果图像是半黑半白,我会得到一些介于两者之间的东西。一些灰色的阴影。它可能是最常见的单色或中值。任何平均值都可以。

我如何在android中做到这一点。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-09-13 22:30:06

代码语言:javascript
运行
复制
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);
票数 52
EN

Stack Overflow用户

发布于 2012-09-13 22:29:07

我想你必须自己去做。

只需创建一个包含所有颜色的int数组:

代码语言:javascript
运行
复制
    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得到颜色,红色的值可能是0xFFFF0000 (最后6个数字是RGB颜色值)。

编辑:简单的解决方案:

代码语言:javascript
运行
复制
Get you full-size image in a bitmap.

Create a scaled bitmap of 1*1px.

Get this bitmap color.
票数 12
EN

Stack Overflow用户

发布于 2014-08-01 09:41:46

在Dan O的解决方案的基础上,这里有一个自动考虑alpha通道并对getPixelsgetPixel进行优化/权衡的方法。

代价是内存,但好处是性能,在可能运行数百万次的循环中调用虚拟方法(例如,8MP图像具有3,456x2,304 =7962,624像素)。我甚至进一步删除了循环的android.graphics.Color方法调用。

代码语言:javascript
运行
复制
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);
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12408431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档