1.采用C的FILE方式读取图片
FILE *fp = fopen(texfile, "rb");
if(NULL == fp){
LOGE("png can't openfile:%s\n", texfile);
return 0;
}
fseek(fp, 0, SEEK_END);
length = (int)ftell(fp);
fseek(fp, 0, SEEK_SET);
//LOGD("png file length:%s %d\n", texfile, length);
pngRawData = (unsigned char*)malloc(length);
fread(pngRawData, 1, length, fp);
fclose(fp);
2.采用OC CGImageRef 处理图片
CGImageRef cgImageRef = [UIImage imageWithData:[NSData dataWithBytes:data length:length]].CGImage;
GLuint width = (GLuint)CGImageGetWidth(cgImageRef);
GLuint height = (GLuint)CGImageGetHeight(cgImageRef);
CGRect rect = CGRectMake(0, 0, width, height);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
void *imageData = malloc(width * height * 4);
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
// 出现反转的问题
// CGContextTranslateCTM(context, 0, height);
// CGContextScaleCTM(context, 1.0f, -1.0f);
CGColorSpaceRelease(colorSpace);
CGContextClearRect(context, rect);
CGContextDrawImage(context, rect, cgImageRef);
UIGraphicsBeginImageContext(CGSizeMake(width, height));
3.采用opengl绑定图片,获取图片id
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
CGContextRelease(context);
free(imageData);
return textureID;
4在使用图片是时候调用gl方法渲染图片
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBindTexture(GL_TEXTURE_2D, pLC->m_IconTex);
glVertexPointer(2, GL_FLOAT, sizeof(IconPoint), (char*)pLC->m_pIconPoints);
glTexCoordPointer(2, GL_FLOAT, sizeof(IconPoint), (char*)pLC->m_pIconPoints + 8);
glDrawArrays(GL_TRIANGLES, 0, pLC->m_iIconPointCnt);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
5.使用GLKView搭配OpenGL方式
创建一个继承于GLKView的试图
添加context
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
[EAGLContext setCurrentContext:self.context];