【iOS开发】获取图片某点或…
来源:互联网 发布:暴躁的母亲知乎 编辑:程序博客网 时间:2024/06/14 12:38
原文地址:与 CGBitmapContextCreate">【iOS开发】获取图片某点或区域的颜色 与 CGBitmapContextCreate 作者:一棵草Telen
CGContextRef CGBitmapContextCreate (
void *data,
size_t width,
size_t height,
size_t bitsPerComponent,
size_t bytesPerRow,
CGColorSpaceRef colorspace,
CGBitmapInfo bitmapInfo
);
参数width代表被渲染内存区域的宽度。
参数height代表被渲染内存区域的高度。
参数bitsPerComponent被渲染内存区域中组件在屏幕每个像素点上需要使用的bits位,举例来说,如果使用32-bit像素和RGB颜色格式,那么RGBA颜色格式中每个组件在屏幕每个像素点上需要使用的bits位就为32/4=8。
参数bytesPerRow代表被渲染内存区域中每行所使用的bytes位数。
参数colorspace用于被渲染内存区域的“位图上下文”。
参数bitmapInfo指定被渲染内存区域的“视图”是否包含一个alpha(透视)通道以及每个像素相应的位置,除此之外还可以指定组件式是浮点值还是整数值。
- (UIColor*) getPixelColorAtLocation:(CGPoint)point {
UIColor* color = nil;
CGImageRef inImage = self.image.CGImage;
// Create off screenbitmap context to draw the image into. Format ARGB is 4 bytes foreach pixel: Alpa, Red, Green, Blue
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}};
// Draw the image tothe bitmap context. Once we draw, thememory
// allocated for thecontext for rendering will then containthe
// raw image data inthe specified color space.
CGContextDrawImage(cgctx, rect, inImage);
// Now we can get apointer to the image data associated with the bitmap
//context.
unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
//offset locates thepixel in the data from x,y.
//4 for 4 bytes ofdata per pixel, w is width of one row of data.
@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 {
}
}
// When finished,release the context
CGContextRelease(cgctx);
// Free image datamemory 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 numberof bytes per row. Each pixel in the bitmap in this
// example isrepresented by 4 bytes; 8 bits each of red, green, blue,and
// alpha.
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
// Use the generic RGBcolor space.
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
fprintf(stderr, "Error allocating colorspacen");
return NULL;
}
// Allocate memory forimage data. This is the destination in memory
// where any drawingto the bitmap context will be rendered.
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
fprintf (stderr, "Memorynot allocated!");
CGColorSpaceRelease( colorSpace );
return NULL;
}
// Create the bitmapcontext. We want pre-multiplied ARGB,8-bits
// per component.Regardless of what the source image formatis
// (CMYK, Grayscale,and so on) it will be converted over to the format
// specified here byCGBitmapContextCreate.
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,