CGBitmapContextCreate函数参数详解

CGBitmapContextCreate函数参数详解

函数原型:

CGContextRef CGBitmapContextCreate (

void *data,
   size_t width,
   size_t height,
   size_t bitsPerComponent,
   size_t bytesPerRow,
   CGColorSpaceRef colorspace,
   CGBitmapInfo bitmapInfo

);

参数:

data                                    指向要渲染的绘制内存的地址。这个内存块的大小至少是(bytesPerRow*height)个字节

width                                  bitmap的宽度,单位为像素

height                                bitmap的高度,单位为像素

bitsPerComponent        内存中像素的每个组件的位数.例如,对于32位像素格式和RGB 颜色空间,你应该将这个值设为8.

bytesPerRow                  bitmap的每一行在内存所占的比特数

colorspace                      bitmap上下文使用的颜色空间。

bitmapInfo                       指定bitmap是否包含alpha通道,像素中alpha通道的相对位置,像素组件是整形还是浮点型等信息的字符串。

描述:

当你调用这个函数的时候,Quartz创建一个位图绘制环境,也就是位图上下文。当你向上下文中绘制信息时,Quartz把你要绘制的信息作为位图数据绘制到指定的内存块。一个新的位图上下文的像素格式由三个参数决定:每个组件的位数,颜色空间,alpha选项。alpha值决定了绘制像素的透明性。

[objc] view plaincopy

    1. Implicit conversion from enumeration type ‘enum CGImageAlphaInfo‘ to different enumeration type ‘CGBitmapInfo‘ (aka ‘enum CGBitmapInfo‘)
    2. 在使用xcode5 sdk iOS7环境,创建图形上下文进行图形绘制,合并,裁剪,特效处理等时避免不了使用如下方法创建位图:
    3. 在 iOS7以前,是使用如下方法创建的:
    4. CG_EXTERN CGContextRef CGBitmapContextCreate(voidvoid *data, size_t width,
    5. size_t height, size_t bitsPerComponent, size_t bytesPerRow,
    6. CGColorSpaceRef space,CGImageAlphaInfo bitmapInfo)
    7. 注意最后一个参数类型是 CGImageAlphaInfo 枚举类型中的kCGImageAlphaPremultipliedLast值。其整型值为1。
    8. typedef CF_ENUM(uint32_t, CGImageAlphaInfo)
    9. {
    10. kCGImageAlphaNone,               /* For example, RGB. */
    11. kCGImageAlphaPremultipliedLast,  /* For example, premultiplied RGBA */
    12. kCGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */
    13. kCGImageAlphaLast,               /* For example, non-premultiplied RGBA */
    14. kCGImageAlphaFirst,              /* For example, non-premultiplied ARGB */
    15. kCGImageAlphaNoneSkipLast,       /* For example, RBGX. */
    16. kCGImageAlphaNoneSkipFirst,      /* For example, XRGB. */
    17. kCGImageAlphaOnly                /* No color data, alpha data only */
    18. };
    19. 但是在iOS7版本中,这个最后的参会类型发生了变化。看一下定义:
    20. CGContextRef CGBitmapContextCreate(voidvoid *data, size_t width,
    21. size_t height, size_t bitsPerComponent, size_t bytesPerRow,
    22. CGColorSpaceRef space, CGBitmapInfo bitmapInfo)
    23. 很明显最后一个参数由CGImageAlphaInfo 变化为 CGBitmapInfo,看一下这个类型的定义
    24. typedef CF_OPTIONS(uint32_t, CGBitmapInfo)
    25. {
    26. kCGBitmapAlphaInfoMask = 0x1F,
    27. kCGBitmapFloatComponents = (1 << 8),
    28. kCGBitmapByteOrderMask = 0x7000,
    29. kCGBitmapByteOrderDefault = (0 << 12),
    30. kCGBitmapByteOrder16Little = (1 << 12),
    31. kCGBitmapByteOrder32Little = (2 << 12),
    32. kCGBitmapByteOrder16Big = (3 << 12),
    33. kCGBitmapByteOrder32Big = (4 << 12)
    34. } CF_ENUM_AVAILABLE(10_4, 2_0);
    35. 从头到尾没有发现值为1的枚举量值。故在使用的时候会出现如下警告:
    36. Implicit conversion from enumeration type ‘enum CGImageAlphaInfo‘ to different enumeration type ‘CGBitmapInfo‘ (aka ‘enum CGBitmapInfo‘)
    37. 意思很明显不过,类型不匹配非法。
    38. 以下给出解决方法:
    39. 第一种方法,定义宏:
    40. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
    41. #define kCGImageAlphaPremultipliedLast  (kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast)
    42. #else
    43. #define kCGImageAlphaPremultipliedLast  kCGImageAlphaPremultipliedLast
    44. #endif
    45. 这样就会直接映射出一个值为1的宏,原有方法不用改变。
    46. 第二种方法:原理和第一个一样,目的 还是为了生产出一个为1的值,直接修改代码。
    47. #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
    48. int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
    49. #else
    50. int bitmapInfo = kCGImageAlphaPremultipliedLast;
    51. #endif
    52. CGContextRef context = CGBitmapContextCreate(nil, CGContexWith*2, 290.0*2, 8, 4*CGContexWith*2, colorSpace, bitmapInfo);
    53. 其实所有的做法,不外乎为了使这里的值为1,类型匹配。你也直接可以传1,不用麻烦的各种写代码。也可以直接进行类型强制转换,这个你随便。只是每个人的习惯不一样,故,如何解决,自己参考决定 。
    54. 转载自:http://hi.baidu.com/yunhuaikong/item/0fe2ccca5f041c7289ad9eac
时间: 2024-11-10 07:49:18

CGBitmapContextCreate函数参数详解的相关文章

C语言中的system函数参数详解

http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令 用   法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用 system()函数用于向操作系统传递控制台命令行,以WINDOWS系统为例,通过system()函数执行命令和在DOS窗口中执行命令的效果是一样的,所以只要在运行窗口中可以使用的命令都可以用SYSTEM()

PHP date函数参数详解

PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载 time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计算, 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就是 time()*60*60*24*365 那么如何把这个数字换成日期格式呢,就要用到date函数了 $t=time();  echo date("Y-m-d H:i:s",$t); 第一个参数的格式分别表示: a -

python2.7函数参数详解

函数参数的匹配原则 位置:从左至右进行匹配 一般情况下,是通过位置进行匹配,把参数值传递给函数头部的参数名称,匹配顺序为从左到右. 关键字参数:通过参数名进行匹配 调用者可以定义哪一个函数接收这个值,通过在调用的时候使用参数的变量名,使用name=value这种语法. 默认参数:为没有传入值的参数定义参数值 如果调用时传入的值过于少的话,函数能够为参数设定默认的参数值,使用name=value这种语法. 可变参数:接收任意多基于位置或关键字的参数 函数能够使用特定的参数,它们是已字符*开头,接收

Python学习笔记5:函数参数详解

一.函数的定义格式: def 函数名(参数列表): 函数体 def fun1(a, b, c): return a + b + c 二.位置传递:位置对应 print(fun1(3 ,2 ,1)) 输出: 6 三.关键字传递:位置参数要出现在关键字参数之前 print(fun1(3 ,c = 1, b = 2)) 输出: 6 四.参数默认值:可以给参数赋予默认值(default) def fun2(a, b, c = 100): return a + b + c print(fun2(1, 10

ajax中error函数参数详解

xhr.status和error函数中的status是不一样的,error函数中的status主要包括:"success"."notmodified"."error"."timeout"."parsererror",而xhr.status如下所讲. 一.error:function (XMLHttpRequest, textStatus, errorThrown) { } (默 认: 自动判断 (xml 或

Dll入口函数参数详解...

DLL程序入口点函数:DllMain,注意:大小写是区别的(仅导出资源的DLL可以没有DllMain函数). 函数原型: BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } 参数意义: ①hModule参数:指向DLL本身的实例句柄:   ②ul_reason_for_call参数:指明了DLL被调用的原因,可以有以下4个取值: 1. DLL_

vue路由导航守卫及前置后置钩子函数参数详解

首先构建一个测试demo如下图: 接着来探讨路由配置界面 import Vue from 'vue' import Router from 'vue-router' // import HelloWorld from '@/components/HelloWorld' Vue.use(Router) const router = new Router({ routes: [{ path: '/', name: 'HelloWorld', component: resolve => require

Python函数参数详解

  Python函数定义时参数灵活,使用不同参数的组合不仅可以简化调用者的代码,还可以处理复杂的参数.函数的参数除了有必选参数外,还可以使用默认参数,可变参数,关键字参数和命名关键字参数. 位置参数 定义一个计算x^2的函数,以及一个计算x^n的函数 def calc1(x): return x * x def calc2(x, n): s = 1 for i in range(n): s *= x return s 对于这两个函数,其参数都是位置参数,同时也是必选参数,调用函数时实参需和形参一

函数参数详解

实参 ''' 位置实参:不用明确形参名的传参方式,一定按照位置给形参传值 关键字实参:必须明确形参名字与值为形参传值,可以不用按照位置 ***** 注:混用 1.关键字实参必须出现在位置实参后 2.多个位置实参还是按照位置传参 3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序 ''' def fn2(a, b, c, d, e, f): print(a, b, c, d, e, f) fn2(10, 20, 30, e=100, f=500, d=200) 位置形参的范畴 位