CGBitmapContextCreate(创建位图绘制上下文)

CG_EXTERN CGContextRef CGBitmapContextCreate 
(
    void *data,
    size_t width, 
    size_t height, 
    size_t bitsPerComponent, 
    size_t bytesPerRow, 
    CGColorSpaceRef space, 
    uint32_t bitmapInfo
);

参数:

  • data:指向要渲染绘制的内存地址。这个内存块大小至少为(bytesPerRow*height)个字节。使用时可传NULL,系统会自动分配内存。
  • width:所需位图(bitmap)的宽度,单位为像素。
  • height:所需位图(bitmap)的高度,单位为像素。
  • bitsPerComponent:内存中像素分量的位数。如,对于32位像素格式和RGB颜色空间时,该值赢设为8。有关支持的像素格式,参阅 Graphics Contexts 中的 Quartz 2D Programming Guide.
  • bytesPerRow:位图每行内存所占的字节数,一个像素一个byte。若前面参数data传的是NULL,则该参数传入0来自动计算。
  • spacebitmap上下文用的颜色空间。注意,位图上下文不支持颜色空间索引。。
  • bitmapInfo:用于指定位图是否包含Alpha通道、Alpha通道在像素中的相对位置、像素分量是整型还是浮点型等信息的常量。想要了解如何指定颜色空间,像素字节数,像素分量字节数,参考 Graphics Contexts。

当你绘制上下文的时候,Core Graohics会将你的绘制在指定的内存块中渲染成位图数据。新位图像素格式决定因素有三个:每个分量的位数、颜色空间、Alpha选项(表示为CGBitmapInfo常量)。

typedef CF_OPTIONS(uint32_t, CGBitmapInfo) 
{
    kCGBitmapAlphaInfoMask = 0x1F,

    kCGBitmapFloatInfoMask = 0xF00,
    kCGBitmapFloatComponents = (1 << 8),

    kCGBitmapByteOrderMask     = kCGImageByteOrderMask,
    kCGBitmapByteOrderDefault  = kCGImageByteOrderDefault,
    kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
    kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
    kCGBitmapByteOrder16Big    = kCGImageByteOrder16Big,
    kCGBitmapByteOrder32Big    = kCGImageByteOrder32Big
} CG_AVAILABLE_STARTING(10.0, 2.0);
  1. RGBA:
const CGSize size = size;
const size_t bitsPerComponent = 8;
const size_t bytesPerRow = size.width * 4; 

CGBitmapContextCreate (
     calloc(sizeof(unsigned char), 
     bytesPerRow * size.height),
     size.width,
     size.height,
     bitsPerComponent,
     bytesPerRow,
     CGColorSpaceCreateDeviceRGB(),
     kCGImageAlphaPremultipliedLast
);
  1. Only Alpha:
const CGSize size = size;
const size_t bitsPerComponent = 8;
const size_t bytesPerRow = size.width; 

CGContextRef context = CGBitmapContextCreate (
    calloc(sizeof(unsigned char), 
    bytesPerRow * size.height), 
    size.width, 
    size.height,
    bitsPerComponent, 
    bytesPerRow,
    NULL,
    kCGImageAlphaOnly
);
  1. 其他例子:
    // 这个imageRef并不包含图片的数据
    // 注意:载入的图片大小必须是2的N次方
    CGImageRef imageRef = [[UIImage imageNamed:@"tile_floor.png"] CGImage];
    size_t width = CGImageGetWidth(imageRef);
    size_t height = CGImageGetHeight(imageRef);
        
    //RGBA个数, 每个像素4个位元组
    GLubyte *textureData = (GLubyte *)malloc(width * height * 4);
    CGContextRef textrureContext = CGBitmapContextCreate(
         textureData,
         width,
         height,
         8, // 每个通道8位, CGImageGetBitsPerComponent(source),
         width * 4,
         CGImageGetColorSpace(imageRef), //CGColorSpaceCreateDeviceRGB()
         kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big //CGImageGetBitmapInfo(source)
    );
    CGContextDrawImage(textrureContext, CGRectMake(0, 0, width, height), imageRef);

你可能感兴趣的:(CGBitmapContextCreate(创建位图绘制上下文))