http://blog.sina.com.cn/s/blog_3e50cef401019cd2.html

CGContextRef CGBitmapContextCreate (

  void *data,

  size_t width,

  size_t height,

  size_t bitsPerComponent,

  size_t bytesPerRow,

  CGColorSpaceRef colorspace,

  CGBitmapInfo bitmapInfo

  );

参数data指向绘图操作被渲染的内存区域,这个内存区域大小应该为(bytesPerRow*height)个字节。如果对绘制操作被渲染的内存区域并无特别的要求,那么可以传递NULL给参数date。

   参数width代表被渲染内存区域的宽度。

   参数height代表被渲染内存区域的高度。

   参数bitsPerComponent被渲染内存区域中组件在屏幕每个像素点上需要使用的bits位,举例来说,如果使用32-bit像素和RGB颜色格式,那么RGBA颜色格式中每个组件在屏幕每个像素点上需要使用的bits位就为32/4=8。

   参数bytesPerRow代表被渲染内存区域中每行所使用的bytes位数。

   参数colorspace用于被渲染内存区域的“位图上下文”。

   参数bitmapInfo指定被渲染内存区域的“视图”是否包含一个alpha(透视)通道以及每个像素相应的位置,除此之外还可以指定组件式是浮点值还是整数值。

网络上抄的一份代码:

@implementation GLView

#import <UIKit/UIKit.h>

#import <QuartzCore/QuartzCore.h>

#import <OpenGLES/ES2/gl.h>

#import <OpenGLES/ES2/glext.h>

#import <OpenGLES/ES1/gl.h>

#import <OpenGLES/ES1/glext.h>

@interface GLView : UIView {

@private

CAEAGLLayer *_eaglLayer;

EAGLContext *_context;

GLuint  _colorRenderBuffer;

GLuint _position;

GLuint _color;

}

@end

#import "GLView.h"

@implementation GLView

// 设置LAYER class, 想要显示OPENGL的内容, 你需要把它缺省的layer设置为一个特殊的layer.

+ (Class)layerClass

{

return [CAEAGLLayer class];

}

// 设置layer为不透明, 缺省的话,CALayer是透明的, 透明的层对性能负荷很打,特别是Opengl的层.

- (void)setupLayer

{

_eaglLayer = (CAEAGLLayer *)self.layer;

_eaglLayer.opaque = YES;

}

// 创建content, 无论你需要OPENGL 帮你做什么 都需要这个EAGLContext, EAGLContext管理所以通过

// opengl进行的draw的信息.

- (void)setupContext

{

EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES1;

_context = [[EAGLContext alloc] initWithAPI:api];

if (!_context)

{

}

if (![EAGLContext setCurrentContext:_context])

{

NSLog(@"Failed to set current context");

}

}

// 创建render buffer(渲染缓冲)

// renderbuffer用于存放渲染过的图像

// glGenRenderbuffers创建一个renderbuffer,返回一个用于标记renderbuffer的名字_colorRenderBuffer;

// 调用glBindRenderbuffer,告诉OPengl 刚创建的对象是GL_RENDERBUFFER类型的对象

// 最后再分配空间

- (void)setupRenderBuffer

{

glGenRenderbuffers(1, &_colorRenderBuffer);

glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);

[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

}

// 创建一个FrameBuffer,(帧缓冲区)

//

- (void)setupFrameBuffer

{

GLuint frameBuffer;

glGenFramebuffers(1, &frameBuffer);

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

// 把刚创建的render buffer 依附到frame buffer的GL_COLOR_ATTACHMENT0位置上

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,

GL_RENDERBUFFER, _colorRenderBuffer);

}

// 在和vertextes shader打交道前, 先清理屏幕 显示另一种颜色.

- (void)render

{

const GLfloat squareVertices[] = {

-0.5f, -0.5f,

0.5f,  -0.5f,

-0.5f,  0.5f,

0.5f,   0.5f,

};

纹理的坐标系 左下为(0, 0)点

const GLshort squarTextureCoords[] = {

0, 0, // top left

0, 1,

1, 0,

1, 1

};

[EAGLContext setCurrentContext:context];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

glViewport(0, 0, backingWidth, backingHeight);

//    // 告诉OPENGL 我们工作在投影模式下

glMatrixMode(GL_PROJECTION);

//    // 重置所有状态, 比如旋转 移动等

glLoadIdentity();

glEnable(GL_TEXTURE_2D);

glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);

glMatrixMode(GL_MODELVIEW);

// 设置一个RGBA颜色, 接下来会用这个颜色来涂抹全屏

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT);

glVertexPointer(2, GL_FLOAT, 0, squareVertices);

glEnableClientState(GL_VERTEX_ARRAY);

glTexCoordPointer(2, GL_SHORT, 0, squarTextureCoords);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

// GL_TRIANGLE_STRIP 最开始的两个顶点除非,然后遍历每个顶点,这些顶点将使用前两个顶点一齐组成三角形

// GL_TRIANGLE_FAN 跳过开始的2个顶点, 然后遍历每个顶点,然后将这些顶点与他们前一个,以及数组的第一个顶点一齐组成三角

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);

[context presentRenderbuffer:GL_RENDERBUFFER_OES];

}

void)loadTexture

{

// 这个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位

width * 4,

CGImageGetColorSpace(imageRef),

kCGImageAlphaPremultipliedLast);

CGContextDrawImage(textrureContext, CGRectMake(0, 0, width, height), imageRef);

// 只需要一张纹理

glGenTextures(1, &_texture[0]);

// 激活纹理 新建的纹理名字加载到当期的纹理单元中

glBindTexture(GL_TEXTURE_2D, _texture[0]);

// 发送纹理数据到OPENGL

// target 基本上都是GL_TEXTURE_2D

// level 纹理的详细程序, 0表示允许图片的全部细节,

// internal_format 和format必须相同

// border 必须始终为0 OPENGL es 不支持纹理边界

// type 像素类型 每个像素占4个字节(无符号整形)

// pixels 实际的图片数据指针

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE, textureData);

// 在和缩小(远矩离)的的时候 我们会把纹理缩小.如何处理(GL_LINEAR 是平滑的, GLNEAREST是选择嘴临近的纹理像素)

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glEnable(GL_TEXTURE_2D);

//

free(textureData);

CGContextRelease(textrureContext);

}

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

[self setupLayer];

[self setupContext];

[self setupRenderBuffer];

[self setupFrameBuffer];

[self loadTexture];

[self render];

}

return self;

}

- (void)dealloc

{

[_context release];

_context = nil;

[super dealloc];

}

@end

iphone CGBitmapContextCreate()函数解释的更多相关文章

  1. CGBitmapContextCreate函数

    CGBitmapContextCreate函数参数详解 函数原型: CGContextRef CGBitmapContextCreate ( void *data,    size_t width, ...

  2. openGL初学函数解释汇总

    openGL初学函数解释汇总 1.GLUT工具包提供的函数 //GLUT工具包所提供的函数 glutInit(&argc, argv);//对GLUT进行初始化,这个函数必须在其它的GLUT使 ...

  3. OpenGL glMatrixMode() 函数解释与例子

    概述 glMatrixMode() 用以指定当前要操作的矩阵,可选值有 GL_MODELVIEW(模型视图,默认值),GL_PROJECTION(投影),GL_TEXTURE(纹理),GL_COLOR ...

  4. 关于js函数解释(包括内嵌,对象等)

    常用写法: function add(a,b) { return a + b; } alert(add(1,2)); // 结果 3 当我们这么定义函数的时候,函数内容会被编译(但不会立即执行,除非我 ...

  5. CGBitmapContextCreate函数参数详解

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

  6. GetSafeHwnd()函数解释[转]

    当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(“ ...

  7. CGBitmapContextCreate函数参数详解 以及在 ios7下变化

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

  8. OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)

    1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...

  9. sqlserver 字符串处理函数解释

    1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错.2.CHAR()将ASCII ...

随机推荐

  1. poj 2674 线性世界 弹性碰撞

    弹性碰撞的题目一般都是指碰到就会掉转方向的一类题目,这里我们可以忽略掉头,仅仅看成擦肩而过,交换名字等等 题意:一条线上N只蚂蚁,每只蚂蚁速度固定,方向和坐标不同,碰头后掉头,求最后掉下去那只蚂蚁的名 ...

  2. 16,docker入门

      在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一 ...

  3. [WC2002][洛谷P1578]奶牛浴场

    洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...

  4. P1021 邮票面值设计

    P1021 邮票面值设计 题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX ...

  5. MySQL之查询性能优化(一)

    为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段, ...

  6. JavaScript获取时间

    var myDate = new Date();            console.log(myDate.getFullYear()); //获取完整的年份(4位,1970-????)       ...

  7. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  8. SPOJ - DQUERY(区间不同数+树状数组)

    链接:SPOJ - DQUERY 题意:求给定区间不同数的个数(不更新). 题解:离线+树状数组. 对所求的所有区间(l, r)根据r从小到大排序.从1-n依次遍历序列数组,在树状数组中不断更新a[i ...

  9. Vim常用指令总结(持续更新中)

    1 模式变更 命令 说明 a(append)/i(insert) 普通模式→插入模式 : 普通模式→命令行模式 ESC或者Ctrl 插入模式→普通模式 R(Replace)/Insert两次 普通模式 ...

  10. 孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务

    孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第五天.今天的感觉是,mongoDB数 ...