您的位置:首页 > 移动开发 > IOS开发

iOS从图片中的一点取色

2016-01-27 15:52 225 查看



来自:http://www.devdiv.com/thread-67521-1-1.html

最近看这个比较多人用到,以前有使用过,现在,粘过来给大伙看看.

注意:UIImageView的大小只能跟图片一样大.要不然取色不对.

- (UIColor *) getPixelColorAtLocation:(CGPoint)point {

UIColor* color = nil;

CGImageRef inImage = self.image.CGImage;

// Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue

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); }

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 = (pixelsWide * 4);

bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);

// Use the generic RGB color space.

colorSpace = CGColorSpaceCreateDeviceRGB();

if (colorSpace == NULL)

{

fprintf(stderr, "Error allocating color space\n");

return NULL;

}

// Allocate memory for image data. This is the destination in memory

// where any drawing to the bitmap context will be rendered.

bitmapData = malloc( bitmapByteCount );

if (bitmapData == NULL)

{

fprintf (stderr, "Memory not allocated!");

CGColorSpaceRelease( colorSpace );

return NULL;

}

// Create the bitmap context. We want pre-multiplied ARGB, 8-bits

// per component. Regardless of what the source image format is

// (CMYK, Grayscale, and so on) it will be converted over to the format

// specified here by CGBitmapContextCreate.

context = CGBitmapContextCreate (bitmapData,

pixelsWide,

pixelsHigh,

8, // bits per component

bitmapBytesPerRow,

colorSpace,

kCGImageAlphaPremultipliedFirst);

if (context == NULL)

{

free (bitmapData);

fprintf (stderr, "Context not created!");

}

// Make sure and release colorspace before returning

CGColorSpaceRelease( colorSpace );

return context;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: