获取uiview的主色、次色和三次色

Posted

技术标签:

【中文标题】获取uiview的主色、次色和三次色【英文标题】:Getting the primary, secondary and tertiary color of uivew 【发布时间】:2016-11-17 05:28:28 【问题描述】:

我使用下面的代码将uiview转换为uiimage

- (UIImage *) imageWithView:(UIView *)view

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;

然后我使用以下代码从 uiimage 中获取平均颜色。

-(UIColor *)averageColorOfImage:(UIImage*)image
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char rgba[3];
    CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), image.CGImage);
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
    if(rgba[2] > 0) 
        CGFloat alpha = ((CGFloat)rgba[3])/255.0;
        CGFloat multiplier = alpha/255.0;
        return [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier
                               green:((CGFloat)rgba[1])*multiplier
                                blue:((CGFloat)rgba[2])*multiplier
                               alpha:alpha];
    else 
        return [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];
    

虽然 uiview 是红色的,但它始终是白色的。

为什么会这样?我怎样才能获得 rgba 颜色代码?还是uiimage的主色、次色、三次色?

【问题讨论】:

您的 rgba 数组只有 3 个元素,因此您正在覆盖内存。在 C 数组声明中,您指定计数而不是最大索引值,因此您需要声明 rgba[4] 你能详细说明一下吗..谢谢 添加了答案,但请注意我在第一行中写的限定 - 这可能不是唯一或最重要的问题 - 因此最初使用评论。 【参考方案1】:

这是您代码中的一个问题,可能还有其他问题 - 这是通过快速阅读您的代码发现的。

在您的代码中声明:

unsigned char rgba[3];

这声明了一个 C 风格(与 Cocoa 相对)固定大小的 三个元素数组;这些元素可以通过rgba[0]rgba[1]rgba[2] 访问。您的代码继续将其用作 元素数组,并使用 不存在rgba[4]。 C 样式数组没有边界检查,因此您的代码会损坏内存。

您需要将数组声明为具有四个元素:

unsigned char rgba[4];

【讨论】:

嗯,这是一个固定的问题 - 内存覆盖 - 显然还有更多。您是否考虑过尝试将图像缩小到大于 1x1px 的大小,然后对结果进行平均?也许 1x1px 太小了。还是根本不减少? 不,兄弟...因为我将 uiview 转换为 uiimage,然后我从转换后的 uiimage 中获取颜色 您正在制作一个 1x1px 的图像,大概是因为您假设 CGContextDrawImage 会在您这样做时产生图像的平均颜色。我的建议是,情况可能并非如此。如果您制作 16 x 16 像素的图像并自己平均 256 像素会发生什么?只是一个供您探索的建议。 好的兄弟....是否可以将 uiview 分成多个部分并像这张图片一样将其粉碎github.com/tyrantgit/ExplosionField/blob/master/… 我已将 uiview 转换为 uiimage,因此我可以获取颜色组件并在中断时对其进行动画处理

以上是关于获取uiview的主色、次色和三次色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Material Design Components for Web 中设置主色和辅助色?

获取任何图像的主色。

屏幕旋转后获取自动旋转 UIView 的尺寸?

UIStackView背景色和自定义间距

将 CAShapeLayer 应用于除 UIButton 之外的主 UIView

在 UIScrollview 中的 UIView 上的屏幕中的框架