【问题标题】:Get stand out color of UIImage获取 UIImage 的突出颜色
【发布时间】:2012-08-25 17:05:31
【问题描述】:

我正在尝试获得在 uiimage 中突出的颜色,就像如果这是照片我会获得红色一样:

我知道要获得平均颜色,我会使用下面的代码,但它会返回 nlack 或灰色作为平均颜色,我希望此代码获得红色。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        unsigned char rgba[4];
        CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

        CGContextDrawImage(context, CGRectMake(0, 0, 1, 1),  artworkImageView.image.CGImage);
        CGColorSpaceRelease(colorSpace);
        CGContextRelease(context);
        UIColor *colorOfArtwork;

         if(rgba[3]) {
            CGFloat alpha = ((CGFloat)rgba[3])/255.0;
            CGFloat multiplier = alpha/255.0;
            colorOfArtwork = [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier
                                   green:((CGFloat)rgba[1])*multiplier
                                    blue:((CGFloat)rgba[2])*multiplier
                                   alpha:alpha];
        }
        else {
            colorOfArtwork =  [UIColor colorWithRed:((CGFloat)rgba[0])/255.0
                                   green:((CGFloat)rgba[1])/255.0
                                    blue:((CGFloat)rgba[2])/255.0
                                   alpha:((CGFloat)rgba[3])/255.0];
        }

【问题讨论】:

    标签: objective-c ios4 uiimage cgcontext uicolor


    【解决方案1】:

    首先,在大多数情况下,这不是一个小问题。对人类来说似乎很明显的东西仍然很难在算法中编码,因为人类对“突出”什么的感知非常复杂。

    如果您总是有只有一种颜色的灰度图像,这可能相对容易,但在蓝天下的同一张图像可能更具挑战性。

    对于您显示的图像,您可以遍历所有像素并将颜色转换为HSV。然后你只能考虑高于某个饱和度阈值的像素并计算它们的平均色调。正如我所说,这仅适用于您的示例图像这样的简单情况,其中实际上只有一种颜色,其余的是灰度。在其他情况下,您可能需要考虑像素的位置(靠近中心的颜色可能更突出)并且不能简单地采用平均色调(对直方图进行聚类可能会起作用)。

    我不会在这里详细介绍如何从图像中获取像素颜色值,您会在 SO 上找到一些关于此的帖子,例如here.

    【讨论】:

    【解决方案2】:

    我做了一些与 omz 的回答非常相似的事情。

    1)。遍历像素并捕获 UIImage 中最常见的颜色

    2)。遍历最常见的颜色并找到具有最高(值 + 饱和度)总和的颜色。

    当我访问 http://colorizer.org 时,我发现值(亮度)加上饱和度会起作用。饱和度为 0 为白色,值为 0 为黑色。在这些颜色的对面,我注意到在大约 100% 的饱和度和值下,这些突出的颜色消退了。

    我尝试过但返回不太理想的另一个选项是将其转换为 HSL 并检索亮度。在 0 - 100 的范围内,50 是饱和度和值将是 100 的位置。因此,您不会获得饱和度和值的最高总和,而是遍历颜色,以获得亮度最接近 50 的颜色。

    我的代码如下:

    #import "ImageHelper.h" //Found Here-> https://github.com/fylfot/MostResentColorUIImage/blob/master/MostRecentColor/ImageHelper.h
    
    ...
    
    float maxDominatingFactor = 0.0;
    UIColor *standOutColor;
    NSArray *colors = [ImageHelper mostFrequentColors:30 of:self withColorPallete:ColorPalete512];
    for(UIColor *color in colors){
        if(([color brightness] + [color saturation]) > maxDominatingFactor){
            standOutColor = color;
            maxDominatingFactor = ([color brightness] + [color saturation]);
        }
    }
    
    //standOutColor is now the stand out color
    

    注意:我在 UIColor 上有一个用于计算亮度和饱和度的类别。

    这是我为它制作的一个项目:

    https://github.com/kdogisthebest/StandOutColor

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      相关资源
      最近更新 更多