获取图片指定点的RGBA

来源:互联网 发布:2016春晚网络直播 编辑:程序博客网 时间:2024/06/12 01:24
/** *  获取图片指定位置的color * *  @param point 需要获取位置的店 *  @param img   需要获取颜色的图片 * *  @return img的point处的位置 */- (UIColor*) getPixelColorAtLocation:(CGPoint)point image:(UIImage *)img {    UIColor* color = nil;    CGImageRef inImage = img.CGImage;    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];    if (cgctx == NULL) { return nil; /* error */ }    size_t w = CGImageGetWidth(inImage);    size_t h = CGImageGetHeight(inImage);    CGRect rect = {{0,0},{w,h}};        // Draw the image to the bitmap context. Once we draw, the memory        // allocated for the context for rendering will then contain the        // raw image data in the specified color space.    CGContextDrawImage(cgctx, rect, inImage);        // Now we can get a pointer to the image data associated with the bitmap        // context.    unsigned char* data = CGBitmapContextGetData (cgctx);    if (data != NULL) {            //offset locates the pixel in the data from x,y.            //4 for 4 bytes of data per pixel, w is width of one row of data.        int offset = 4*((w*round(point.y))+round(point.x));        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)];    }        // When finished, release the context    CGContextRelease(cgctx);        // Free image data memory for the context    if (data) { free(data); }    LogRed(@"%@",color);    return color;}- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {    CGContextRef    context = NULL;    CGColorSpaceRef colorSpace;    void *          bitmapData;    int             bitmapByteCount;    int             bitmapBytesPerRow;        // Get image width, height. We'll use the entire image.    size_t pixelsWide = CGImageGetWidth(inImage);    size_t pixelsHigh = CGImageGetHeight(inImage);        // Declare the number of bytes per row. Each pixel in the bitmap in this        // example is represented by 4 bytes; 8 bits each of red, green, blue, and        // alpha.    bitmapBytesPerRow   = (int)(pixelsWide * 4);    bitmapByteCount     = (int)(bitmapBytesPerRow * pixelsHigh);        // Use the generic RGB color space.    colorSpace = CGColorSpaceCreateDeviceRGB();    if (colorSpace == NULL)    {        fprintf(stderr, "Error allocating color space\n");        return NULL;    }        //为img申请空间    bitmapData = malloc( bitmapByteCount );    if (bitmapData == NULL)    {        fprintf (stderr, "Memory not allocated!");        CGColorSpaceRelease( colorSpace );        return NULL;    }        //创建bitmap上下文,每部分8个字节,这里不区分图片的格式,都会被CGBitmapContextCreate转成想要的格式    context = CGBitmapContextCreate (bitmapData,                                     pixelsWide,                                     pixelsHigh,                                     8,                                     bitmapBytesPerRow,                                     colorSpace,                                     kCGImageAlphaPremultipliedFirst);    if (context == NULL)    {        free (bitmapData);        fprintf (stderr, "Context not created!");    }            // 适当空间    CGColorSpaceRelease( colorSpace );        return context;}

0 0
原创粉丝点击