取色功能的实现

核心代码如下,具体功能请参考附件。

 

- (UIColor *) getPixelColorAtLocation:(CGPoint)point {
	UIColor *color = nil;
	CGImageRef inImage = self.image.CGImage;
	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}}; 
    
	CGContextDrawImage(cgctx, rect, inImage); 
	
	unsigned char *data = CGBitmapContextGetData(cgctx);
	if (data != NULL) {
		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]; 
		color = [UIColor colorWithRed:(red / 255.0f) green:(green / 255.0f) blue:(blue / 255.0f) alpha:(alpha / 255.0f)];
	}
	
	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);
    
	bitmapBytesPerRow = (pixelsWide * 4);
	bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
    
	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, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow,
                                    colorSpace, kCGImageAlphaPremultipliedFirst);
	if (context == NULL) {
		free(bitmapData);
		fprintf(stderr, "Context not created!");
	}
	
	CGColorSpaceRelease(colorSpace);
	
	return context;
}

 

示例图:

取色功能的实现

你可能感兴趣的:(ios,iPhone,取色)