函数原型:

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值决定了绘制像素的透明性。

CGBitmapContextCreate 在 ios7下变化

Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGBitmapInfo' (aka 'enum CGBitmapInfo')

在使用xcode5 sdk iOS7环境,创建图形上下文进行图形绘制,合并,裁剪,特效处理等时避免不了使用如下方法创建位图:

在 iOS7以前,是使用如下方法创建的:

CG_EXTERN CGContextRef CGBitmapContextCreate(void *data, size_t width,

size_t height, size_t bitsPerComponent, size_t bytesPerRow,

CGColorSpaceRef space,CGImageAlphaInfo bitmapInfo)

注意最后一个参数类型是 CGImageAlphaInfo 枚举类型中的kCGImageAlphaPremultipliedLast值。其整型值为1。

typedef CF_ENUM(uint32_t, CGImageAlphaInfo)

{

kCGImageAlphaNone,               /* For example, RGB. */

kCGImageAlphaPremultipliedLast,  /* For example, premultiplied RGBA */

kCGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */

kCGImageAlphaLast,               /* For example, non-premultiplied RGBA */

kCGImageAlphaFirst,              /* For example, non-premultiplied ARGB */

kCGImageAlphaNoneSkipLast,       /* For example, RBGX. */

kCGImageAlphaNoneSkipFirst,      /* For example, XRGB. */

kCGImageAlphaOnly                /* No color data, alpha data only */

};

但是在iOS7版本中,这个最后的参会类型发生了变化。看一下定义:

CGContextRef CGBitmapContextCreate(void *data, size_t width,

size_t height, size_t bitsPerComponent, size_t bytesPerRow,

CGColorSpaceRef space, CGBitmapInfo bitmapInfo)

很明显最后一个参数由CGImageAlphaInfo 变化为 CGBitmapInfo,看一下这个类型的定义

typedef CF_OPTIONS(uint32_t, CGBitmapInfo)

{

kCGBitmapAlphaInfoMask = 0x1F,

kCGBitmapFloatComponents = (1 << 8),

kCGBitmapByteOrderMask = 0x7000,

kCGBitmapByteOrderDefault = (0 << 12),

kCGBitmapByteOrder16Little = (1 << 12),

kCGBitmapByteOrder32Little = (2 << 12),

kCGBitmapByteOrder16Big = (3 << 12),

kCGBitmapByteOrder32Big = (4 << 12)

} CF_ENUM_AVAILABLE(10_4, 2_0);

从头到尾没有发现值为1的枚举量值。故在使用的时候会出现如下警告:

Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGBitmapInfo' (aka 'enum CGBitmapInfo')

意思很明显不过,类型不匹配非法。

以下给出解决方法:

第一种方法,定义宏:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1

#define kCGImageAlphaPremultipliedLast  (kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast)

#else

#define kCGImageAlphaPremultipliedLast  kCGImageAlphaPremultipliedLast

#endif

这样就会直接映射出一个值为1的宏,原有方法不用改变。

第二种方法:原理和第一个一样,目的 还是为了生产出一个为1的值,直接修改代码。

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1

int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;

#else

int bitmapInfo = kCGImageAlphaPremultipliedLast;

#endif

CGContextRef context = CGBitmapContextCreate(nil, CGContexWith*2, 290.0*2,
8, 4*CGContexWith*2, colorSpace, bitmapInfo);

其实所有的做法,不外乎为了使这里的值为1,类型匹配。你也直接可以传1,不用麻烦的各种写代码。也可以直接进行类型强制转换,这个你随便。只是每个人的习惯不一样,故,如何解决,自己参考决定 。

CGBitmapContextCreate函数参数详解 以及在 ios7下变化的更多相关文章

  1. CGBitmapContextCreate函数参数详解

    函数原型: CGContextRef CGBitmapContextCreate ( void *data, size_t width, size_t height, size_t bitsPerCo ...

  2. PHP date函数参数详解

    PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载       time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计 ...

  3. Python函数参数详解

    Python函数参数详解 形参与实参 什么是形参 在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名. 什么是实参 在调用函数阶段传入的值称为实际参数,简称实参.相当于"变量值& ...

  4. Go语言Slice作为函数参数详解

    Go语言Slice作为函数参数详解 前言 首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说. 个人认为上诉的结论不对,把引用类型看做对指针的封装,一般封装为结构体,结构体是值 ...

  5. 【集成学习】sklearn中xgboot模块中fit函数参数详解(fit model for train data)

    参数解释,后续补上. # -*- coding: utf-8 -*- """ ############################################## ...

  6. Python3学习笔记(十一):函数参数详解

    一.位置参数 根据参数的位置来传递参数,调用函数时,传递的参数顺序和个数必须和定义时完全一致 # 定义函数 def man(name, age): print("My name is %s, ...

  7. PHP中date函数参数详解

    date函数输出当前的时间echo date('Y-m-d H:i:s', time()); // 格式:xxxx-xx-xx xx:xx:xx 第一个参数的格式分别表示: a - "am& ...

  8. ajax中error函数参数详解

    xhr.status和error函数中的status是不一样的,error函数中的status主要包括:"success"."notmodified".&quo ...

  9. Python包管理工具setuptools之setup函数参数详解

    **********************************************************对所学内容的简单汇总******************************** ...

随机推荐

  1. Jenkins进阶-远程构建任务(4)

    开发过程中提交代码以后,如何不登录Jenkins就自动触发jenkins 任务来发布软件版本. 1.首先我们创建一个Jenkins任务. 2.选择"构建触发器"->勾选&qu ...

  2. C#调用Python脚本的简单示例

    C#调用Python脚本的简单示例 分类:Python (2311)  (0)  举报  收藏 IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Huguni ...

  3. 胡乱摸的NOIP2017游记和总结

    来自YZK的总结 本篇总结主要分成两部分:NOI Professional游记和平日的刷题训练. 今年的NOI Professional TG的难度在洛谷上标记为:二黄一绿三紫.恭喜NOIP今年全面脱 ...

  4. appium定位方法

    1.id定位 driver.find_element_by_id("这里是resource-id") 2.name定位 (新版本的appium 1.7 已经没有这个定位方法了) d ...

  5. EasyMall 项目记录-环境搭建

    一.搭建项目运行的环境 (1)修改hosts文件 更改:C:\Windows\System32\drivers\etc目录下hosts文件 添加:127.0.0.1        www.easyma ...

  6. 扫盲贴,802.11AD

    早在去年,大家已经开始关注新的802.11ad规范,其高频高带宽低延迟的特性也让大家对将来的无线网络应用形态充满了期待,而今年的CES2016展会上,已经有不少的802.11ad产品出现,看来2016 ...

  7. [UE4]运行时创建Actor

  8. python protobuf序列化repeated运用

    下面是proto描述文件的定义 message Person { required string name = 1; required int32 id = 2; optional string em ...

  9. Vector的小知识点

    预留容量的两类方式: 1.不调用默认的构造函数 vector<int> v; v.push_back(111); v.reserve(20); std::copy(v.begin(), v ...

  10. Oracle直方图的详细解析(转)

    Oracle直方图解析 一.    何谓直方图: 直方图是一种统计学上的工具,并非Oracle专有.通常用于对被管理对象的某个方面的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根 ...