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 screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
CGContextRef
cgctx
=
[self
createARGBBitmapContextF
romImage: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 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.
@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 data memory for the context
if
(data)
{
free(data);
}
return
color;
}
}
创建取点图片工作域:
-
(CGContextRef)
createARGBBitmapContextF
romImage:(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
=
CGColorSpaceCreateDevice
RGB();
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,
kCGImageAlphaPremultipli
edFirst);
if
(context
==
NULL)
{
free
(bitmapData);
fprintf
(stderr,
"Context not created!");
}
// Make sure and release colorspace before returning
CGColorSpaceRelease(
colorSpace
);
return
context;
}
}
备忘。