获取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 中设置主色和辅助色?