获取图片的主色调

有时候我们需要找出一张图片中的主色调,这里的主色调并不是指颜色最多的,而是指最“醒目”的。

例如 win8 在更换桌面壁纸后,会将任务栏的背景色改为该壁纸的主色调。

看下面几张图可以更直观的明白“醒目”的意思。

(这张图里面最醒目的无疑是紫红色的小花,而不是颜色占大多数的淡青色背景)

(这张图也一样,最醒目的颜色应该是深红色,而不是深蓝色)

我想了一个简单的办法,就是根据图片中每个像素的色调值去判断哪些像素符合“醒目”这个特性。

分三步进行

1.计算整个图片的色调的平均值 (avg_hue)

2.遍历每个像素,计算该像素的色调值与 avg_hue 的色差(即将二者相减后取绝对值),如果该色差大于一个阈值(本文中取 30),

则将该像素加入到“醒目像素”的列表

3.计算整个“醒目像素列表”的颜色均值,得到的结果即为该图片的主色调。

下面看看该算法的效果如何

我将计算出的主色调画在原图的左上角,以方便对比。结果如下

可以看到基本上达到了我想要的效果。

下面给出具体代码,代码未经任何优化,速度比较慢。

?




Color get_major_color(Bitmap bitmap)

{

    //色调的总和

    var
sum_hue = 0d;

    //色差的阈值

    var
threshold = 30;

    //计算色调总和

    for
(int
h = 0; h < bitmap.Height; h++)

    {

        for
(int
w = 0; w < bitmap.Width; w++)

        {

            var
hue = bitmap.GetPixel(w, h).GetHue();

            sum_hue += hue;

        }

    }

    var
avg_hue = sum_hue / (bitmap.Width * bitmap.Height);

    //色差大于阈值的颜色值

    var
rgbs = new
List<Color>();

    for
(int
h = 0; h < bitmap.Height; h++)

    {

        for
(int
w = 0; w < bitmap.Width; w++)

        {

            var
color = bitmap.GetPixel(w, h);

            var
hue = color.GetHue();

            //如果色差大于阈值,则加入列表

            if
(Math.Abs(hue - avg_hue) > threshold)

            {

                rgbs.Add(color);

            }

        }

    }

    if
(rgbs.Count == 0)

        return
Color.Black;

    //计算列表中的颜色均值,结果即为该图片的主色调

    int
sum_r = 0, sum_g = 0, sum_b = 0;

    foreach
(var
rgb in
rgbs)

    {

        sum_r += rgb.R;

        sum_g += rgb.G;

        sum_b += rgb.B;

    }

    return
Color.FromArgb(sum_r / rgbs.Count,

        sum_g / rgbs.Count,

        sum_b / rgbs.Count);

}

获取图片的主色调,码迷,mamicode.com

时间: 2024-08-11 09:11:07

获取图片的主色调的相关文章

JS获取图片的缩略图,并且动态的加载多张图片

找了好多资料也没有找到该死的ie的解决办法,最后放弃了ie <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>js获取缩略图</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <st

怎样从server获取图片

今天写了安卓程序与server通信.当中须要从server获取图片.本来以为下载流.处理文件流非常复杂.结果几句话就轻松搞定了.如今记在这里. // (2014.5.1第一种方法)通过server返回的图片url,再次向server请求,加入动态新闻图片 // 读取Bitmap图片 try { Bitmap bm; URL url; url = new URL(map.get("activityPhoto").toString()); HttpURLConnection conn =

UIImagePickerController从拍照、图库、相册获取图片

iOS 获取图片有三种方法: 1. 直接调用摄像头拍照 2. 从相册中选择 3. 从图库中选择 UIImagePickerController 是系统提供的用来获取图片和视频的接口: 用UIImagePickerController 类来获取图片视频,大体分为以下几个步骤: 1. 初始化UIImagePickerController 类: 2. 设置UIImagePickerController 实例的数据来源类型(下面解释): 3. 设置设置代理: 4. 如果需要做图片修改的话设置allows

如何通过js和jquery获取图片真实的宽度和高度

在做pc网页的时候,有时候会考虑按照插入的图片的尺寸来判断图片是横图还是竖图.然后判断过后给予不同的展示方式! 另外一种就是在手机页面上,在新闻页插入的图片往往都是按照图片的原尺寸来展示,如果手机屏幕太小,太大的图就会超出去!这时候有两种解决办法 1.给所有的图片加上这样的样式 .news img{margin:5px auto; display:block;width:100%; height:auto;} 但是这种方式有另外一个问题就是,如果插入的图片本身就很小的话,也会被直接拉伸成100%

Android图片系列(1)-------调用系统相册与相机获取图片

Android开发过程中,我们经常需要获取图片,你可以通过获取手机相册的图片,也可以调用相机拍照获取图片.这里主要讲这两个获取图片的方式,并记录其中遇到的小问题. 调用相册获取图片 这个功能非常简单,这里不多说了,这里贴出关键代码 Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT); openAlbumIntent.setType("image/*"); startActivityForResult(openAl

android获取图片的旋转角度

public static int getExifOrientation(String filepath) { int degree = 0; ExifInterface exif = null; try { exif = new ExifInterface(filepath); } catch (IOException ex) { Log.d(TAG, "cannot read exif" + ex); } if (exif != null) { int orientation =

添加资源图片,获取图片实例并绘制到窗体

项目右键属性——资源——添加资源展开——添加现有文件 paint方法中: private void Form1_Paint(object sender, PaintEventArgs e) { using (Graphics g = e.Graphics) { g.DrawImage((Image)zhbImgConvert.Properties.Resources.ResourceManager.GetObject("_001"), 10, 70); } } 添加资源图片,获取图片实

积跬步,聚小流------java获取图片的尺寸

在一篇文章中获取到通过例如以下两种方式进行获取: 1.使用ImageReader进行获取: 2.使用BufferedImage进行获取: 而且经过验证ImageReader进行操作的耗时远远低于BufferedImage操作的耗时,详情可查看链接查看原文 然后依据应用我自己在项目中略做修改,在这里记录下: <span style="font-size:14px;">package com.jzba.utils; import java.awt.image.BufferedI

JavaScript获取图片的原始尺寸

页面里的img元素,想要获取它的原始尺寸,以宽度为例可能首先想到的就是width,如下 1 2 3 4 5 <img src=" http://img11.360buyimg.com/da/g14/M07/01/0E/rBEhVlNhh8wIAAAAAADmFBLo1twAAM26gOmCgYAAOYs716.jpg"> <script> var img = document.getElementsByTagName('img')[0] var width =