iphone CGBitmapContextCreate()函数解释
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()函数解释的更多相关文章
- CGBitmapContextCreate函数
CGBitmapContextCreate函数参数详解 函数原型: CGContextRef CGBitmapContextCreate ( void *data, size_t width, ...
- openGL初学函数解释汇总
openGL初学函数解释汇总 1.GLUT工具包提供的函数 //GLUT工具包所提供的函数 glutInit(&argc, argv);//对GLUT进行初始化,这个函数必须在其它的GLUT使 ...
- OpenGL glMatrixMode() 函数解释与例子
概述 glMatrixMode() 用以指定当前要操作的矩阵,可选值有 GL_MODELVIEW(模型视图,默认值),GL_PROJECTION(投影),GL_TEXTURE(纹理),GL_COLOR ...
- 关于js函数解释(包括内嵌,对象等)
常用写法: function add(a,b) { return a + b; } alert(add(1,2)); // 结果 3 当我们这么定义函数的时候,函数内容会被编译(但不会立即执行,除非我 ...
- CGBitmapContextCreate函数参数详解
函数原型: CGContextRef CGBitmapContextCreate ( void *data, size_t width, size_t height, size_t bitsPerCo ...
- GetSafeHwnd()函数解释[转]
当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(“ ...
- CGBitmapContextCreate函数参数详解 以及在 ios7下变化
函数原型: CGContextRef CGBitmapContextCreate ( void *data, size_t width, size_t height, size_t ...
- OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)
1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...
- sqlserver 字符串处理函数解释
1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错.2.CHAR()将ASCII ...
随机推荐
- C语言进阶——goto 和 void 的分析08
遭人遗弃的goto: 高手潜规则:禁止使用goto 项目经验:程序质量与goto的出现次数成反比 最后的判决:将goto打入冷宫 程序示例1:(goto副作用分析) #include <stdi ...
- 适配IE8+等浏览器的适配播放插件
function myBrowser(){ var userAgent = navigator.userAgent; //ȡ���������userAgent�ַ� var isOpera = us ...
- 大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo
上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析Demo”啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货 ...
- perl实现监控linux
1.使用root用户telnet进入linux系统 2.修改DNS以下两种方法 A.通过setup命令配置dns B.通过在/etc目录下创建resolv.conf文件 3.查看DNS是否配置成功 [ ...
- Android stadio Switch repository Android stadio切换仓库
Android stadio 有时候,有很多module. 这些module 都有自己的仓库.也就是不在一块.那么,Android stadio 默认管理的就是根git. 如图,画对号的就是默认的. ...
- android stadio 打开别人的工程 一直在编译中
这是因为,他工程的gradle 配置,在你本地找不到,所以,会去网上下.然后解压,使用.这是一个很漫长的过程. *那么怎么做呢 修改项目工程的gradle/wrapper/gradle-wrapper ...
- 从键盘输入数,输出它们的平方值&判断是不是2的阶次方数
1.从键盘输入两个整数,然后输出它们的平方值和立方值 在Java中,没有像C语言那样有一个专供接受键盘输入值的scanf函数,所以一般的做法是从键盘输入一行字符,保存到字符串s中,再将字符组成的字符串 ...
- MyEclipse - 问题集 - Workspace in use or cannot be created, choose a different one(转)
转:http://wsfly.iteye.com/blog/1044986 eclipse 使用一段时间后,有时会因为一些故障自己就莫名奇妙的关闭了,再打开时有时没有问题,有时有会提示错误 Works ...
- script async和defer
1.没有async和defer,html解析时遇到script标签,会先去下载js文件,文件加载完成立即执行,执行完了再开始解析后面的html,是一个顺序流的过程 2.async,加载和渲染后续文档元 ...
- Java8 时间处理
Table of Contents 前言 时间单位和时区 时间点 时间段 时间的解析和格式化 时区时间 兼容旧接口 结语 前言 时间处理是一个经常会用到但又不那么好用的功能,其中的主要问题在于对人友好 ...