美文网首页
CGBitmapContextCreate(创建位图绘制上下文)

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

作者: 开发者老岳 | 来源:发表于2020-01-07 12:07 被阅读0次
    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(创建位图绘制上下文)

          本文链接:https://www.haomeiwen.com/subject/ghjractx.html