美文网首页
获取图片某个点的颜色

获取图片某个点的颜色

作者: 熊妹妹 | 来源:发表于2016-12-26 14:07 被阅读401次

过程如下:

  1. 生成位图上下文
  2. 在上下文绘制图片
  3. 生成图片数据
  4. 计算对应点的数据偏移位置
  5. 取出像素值

代码如下:

- (UIColor*)getPixelColorAtLocation:(CGPoint)point {
    UIColor* color = nil;
    //创建像素位图
    CGImageRef inImage = self.cView.image.CGImage;
    //创建一个bitmap context  ARGB(Alpa, Red, Green, Blue)格式每个像素用占4字节,32个bit
    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];

    if (cgctx == NULL) { return nil;  }
    
    size_t w = CGImageGetWidth(inImage);
    size_t h = CGImageGetHeight(inImage);
    CGRect rect = {{0,0},{w,h}};
    
    //把image画到bitmap context上。
    CGContextDrawImage(cgctx, rect, inImage);
    
    //图片数据的指针
    unsigned char* data = CGBitmapContextGetData(cgctx);
    if (data != NULL) {
        //用x y计算data偏移位置,每个像素4bytes
        @try {
            int offset = 4*((w*round(point.y))+round(point.x));//计算像素位置
            NSLog(@"offset: %d", offset);
            int alpha =  data[offset];
            int red = data[offset+1];
            int green = data[offset+2];
            int blue = data[offset+3];
            NSLog(@"offset: %i colors: RGB A %i %i %i  %i",offset,red,green,blue,alpha);
            color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];
        }
        @catch (NSException * e) {
            NSLog(@"%@",[e reason]);
        }
        @finally {
        }
        
    }

    //释放绘图上下文
    CGContextRelease(cgctx);
    //释放图片数据
    if (data) { free(data); }
    
    return color;
}

- (CGContextRef)createARGBBitmapContextFromImage:(CGImageRef)inImage
{
    CGContextRef context = NULL;
    CGColorSpaceRef colorSpace;
    void *bitmapData;
    int bitmapByteCount;
    int bitmapBytesPerRow;
    
    //图片宽高
    size_t pixelsWide = CGImageGetWidth(inImage);
    size_t pixelsHigh = CGImageGetHeight(inImage);
    
    //计算每一行数据字节大小,每一个像素是4 bytes:red,green,blue,alpha各8 bits
    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);
    
    //RGB颜色空间:不同颜色在不同的维度上取值最终组成一种颜色的过程
    colorSpace = CGColorSpaceCreateDeviceRGB();
    
    if (colorSpace == NULL)
    {
        fprintf(stderr,"Error allocating color space\n");
        return NULL;
    }
    
    // 创建图片数据内存,这个内存地址存储绘制到位图上下文的结果
    bitmapData = malloc(bitmapByteCount);
    if (bitmapData == NULL)
    {
        fprintf(stderr,"Memory not allocated!");
        CGColorSpaceRelease(colorSpace);
        return NULL;
    }
    
    //创建位图上下文
    context = CGBitmapContextCreate(bitmapData,//指向绘图操作被渲染的内存区域,这个内存区域大小应该为(bytesPerRow*height)个字节。如果对绘制操作被渲染的内存区域并无特别的要求,那么可以传递NULL给参数date。
                                    pixelsWide,//被渲染内存区域的宽度
                                    pixelsHigh,//被渲染内存区域的高度
                                    8,//渲染内存区域中组件在屏幕每个像素点上需要使用的bits位,举例来说,如果使用32-bit像素和RGB颜色格式,那么RGBA颜色格式中每个组件在屏幕每个像素点上需要使用的bits位就为32/4=8。
                                    bitmapBytesPerRow,//渲染内存区域中每行所使用的bytes位数
                                    colorSpace,//颜色空间
                                    kCGImageAlphaPremultipliedFirst);//指定被渲染内存区域的“视图”是否包含一个alpha(透视)通道以及每个像素相应的位置,除此之外还可以指定组件式是浮点值还是整数值,此处代表着图片的BGR值是已乘以Alpha值
    if (context == NULL)
    {
        free(bitmapData);
        fprintf(stderr,"Context not created!");
    }
    
    //释放颜色空间
    CGColorSpaceRelease(colorSpace);
    
    return context;
}

相关文章

网友评论

      本文标题:获取图片某个点的颜色

      本文链接:https://www.haomeiwen.com/subject/ueujvttx.html