ToB企服应用市场:ToB评测及商务社交产业平台

标题: iOS 多次获取图片主题色不一样 [打印本页]

作者: 滴水恩情    时间: 2024-10-11 22:47
标题: iOS 多次获取图片主题色不一样
一个需求中,要求获取图片的主题色
代码如下
  1. -(void)kk_getImage:(UIImage *)image fetchthemeColor:(void(^)(UIColor *color))callBack {
  2.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  3.         // 第一步 先把图片缩小 加快计算速度. 但越小结果误差可能越大
  4.         int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
  5.         CGSize thumbSize = CGSizeMake(100, 100*self.backgroundImgView.height/(self.backgroundImgView.width ?: 100));
  6.         CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  7.         CGContextRef context = CGBitmapContextCreate(NULL,thumbSize.width,thumbSize.height, 8, thumbSize.width*4, colorSpace,bitmapInfo);
  8.         CGRect drawRect = CGRectMake(0, 0, thumbSize.width, thumbSize.height);
  9.         CGContextDrawImage(context, drawRect, image.CGImage);
  10.         CGColorSpaceRelease(colorSpace);
  11.         
  12.         // 第二步 取每个点的像素值
  13.         unsigned char* data = CGBitmapContextGetData (context);
  14.         if (data == NULL) {
  15.             dispatch_async(dispatch_get_main_queue(), ^{
  16.                 callBack(nil);
  17.             });
  18.         };
  19.         NSCountedSet* cls = [NSCountedSet setWithCapacity: thumbSize.width * thumbSize.height];
  20.         for (int x = 0; x < thumbSize.width; x++) {
  21.             for (int y = 0; y < thumbSize.height; y++) {
  22.                 int offset = 4 * (x * y);
  23.                 int red = data[offset];
  24.                 int green = data[offset + 1];
  25.                 int blue = data[offset + 2];
  26.                 int alpha =  data[offset + 3];
  27.                 // 过滤透明的、基本白色、基本黑色
  28.                 // 这里限制170是因为要去除偏亮的颜色 越接近250越亮
  29.                 if (alpha > 0 && (red < 170 && green < 170 && blue < 170) && (red > 5 && green > 5 && blue > 5)) {
  30.                     NSArray *clr = @[@(red),@(green),@(blue),@(alpha)];
  31.                     [cls addObject:clr];
  32.                 }
  33.             }
  34.         }
  35.         CGContextRelease(context);
  36.         
  37.         //第三步 找到出现次数最多的那个颜色
  38.         NSEnumerator *enumerator = [cls objectEnumerator];
  39.         NSArray *curColor = nil;
  40.         NSArray *MaxColor = nil;
  41.         NSUInteger MaxCount = 0;
  42.         while ((curColor = [enumerator nextObject]) != nil){
  43.             NSUInteger tmpCount = [cls countForObject:curColor];
  44.             if ( tmpCount < MaxCount ) continue;
  45.             MaxCount = tmpCount;
  46.             MaxColor = curColor;
  47.         }
  48.         UIColor * subjectColor = [UIColor colorWithRed:([MaxColor[0] intValue]/255.0f) green:([MaxColor[1] intValue]/255.0f) blue:([MaxColor[2] intValue]/255.0f) alpha:([MaxColor[3] intValue]/255.0f)];
  49.         dispatch_async(dispatch_get_main_queue(), ^{
  50.             callBack(subjectColor);
  51.         });
  52.     });
  53. }
复制代码
以上代码在多数情况下都没有题目,但是遇到一个情况,有一张图片,下拉刷新的时间,获取到的主题色和初次获取到的不一样,然后多次下拉刷新, 又能规复初次提取的主题色,颠末反复排查,发现题目是我们提取主题色的时间设置的size过小,导致每次提取主题色的误差比较大,所以修复方法就是增大提取主题色的size,将
CGSize thumbSize = CGSizeMake(100, 100self.backgroundImgView.height/(self.backgroundImgView.width ?: 100));
这一句代码中的100, 改成200就可以了
CGSize thumbSize = CGSizeMake(200, 200
self.backgroundImgView.height/(self.backgroundImgView.width ?: 200));
如许处置惩罚之后,每次获取到的主题色都是相同的

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4