您好我们可以从UIImage获得哈希颜色字符串吗?
在下面的方法中如果我通过[UIColor redColor]它正在工作,但如果我通过
#define THEME_COLOR [UIColor colorWithPatternImage:[UIImage imageNamed:@"commonImg.png"]]
然后它不起作用。
+(NSString *)hexValuesFromUIColor:(UIColor *)color {
if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
const CGFloat *components = CGColorGetComponents(color.CGColor);
color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]];
}
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
return [NSString stringWithFormat:@"#FFFFFF"];
}
return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];
}
还有其他方法可以直接从UIImage中获取Hash颜色吗?
答案 0 :(得分:0)
您无法直接访问原始数据,但通过获取此图像的CGImage,您可以访问它。参考Link
答案 1 :(得分:0)
您无法直接从UIImage
执行此操作,但您可以使用您提供的内存缓冲区将图像渲染到位图上下文中,然后直接测试内存。这听起来比实际情况更复杂,但可能仍然比你想听的更复杂。
如果你有Erica Sadun的iPhone开发者手册,可以从第54页开始对它进行很好的报道。我会推荐这本书,所以如果你没有这本书,那就值得一试。
我独立地得到了几乎完全相同的代码,但是也遇到了一个看起来可能在Sadun的代码中的错误。在pointInside方法中,point和size值是浮点数,并在被转换为int之前作为浮点数相乘。如果您的坐标是谨慎值,这很好,但在我的情况下,我提供了子像素值,因此公式崩溃了。一旦你确定了问题,修复很容易 - 当然 - 只需在乘法之前将每个坐标转换为int - 所以,在Sadun的情况下它将是:
long startByte = ((int)point.y * (int)size.width) + (int)point.x) * 4;
此外,Sadun的代码以及我自己的代码仅对alpha
值感兴趣,因此我们使用仅采用alpha值的8位像素。更改CGBitMapContextCreate
调用应允许您获得实际颜色值(显然,如果每个像素的比特数超过8位,则必须将其乘以您的pointInside公式)。