设为首页 加入收藏

TOP

libpng的PNG图片读取
2014-11-24 02:56:06 来源: 作者: 【 】 浏览:1
Tags:libpng PNG 图片 读取

libpng的PNG图片读取,该程序只支持RGBA方案的PNG图片不支持PNG其他方案特性
#include
#include
#include
#include
#include "png.h"



#pragma comment(lib, "glew32.lib")



int window_width=600;
int window_height=600;



int pic_width;
int pic_height;
int size;



GLuint texName;
unsigned char *content;



void init()
{
glewInit();



glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);



glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pic_width, pic_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, content);
}



void display_func()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 1.0f, 0.0, 1.0f);



glViewport(0, 0, window_width, window_height);
glClearColor(1.0f, 1.0f, 1.0f, 1.0);
glClear(GL_COLOR_BUFFER_BIT);



glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBindTexture(GL_TEXTURE_2D, texName);



glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
glEnd();
glutSwapBuffers();
}



void reshape_func(int width, int height)
{
window_width=width;
window_height=height;
glutReshapeWindow(window_width, window_height);
}



int main(int argc, char **argv)
{
FILE* file = fopen("wiki.png", "rb");
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
png_infop info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
png_init_io(png_ptr, file);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);



pic_width = png_get_image_width(png_ptr, info_ptr);
pic_height = png_get_image_height(png_ptr, info_ptr);
int color_type = png_get_color_type(png_ptr, info_ptr);



size = pic_height * pic_width * 4;
int pos = 0;
content=(unsigned char *)malloc(sizeof(unsigned char)*size);



png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);



for(int i=0; i
{
for(int j=0; j
{
content[i*pic_width*4+j*4+0]=row_pointers[i][j*4+0];
content[i*pic_width*4+j*4+1]=row_pointers[i][j*4+1];
content[i*pic_width*4+j*4+2]=row_pointers[i][j*4+2];
content[i*pic_width*4+j*4+3]=row_pointers[i][j*4+3];
}
}



png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(file);



window_width=pic_width;
window_height=pic_height;



glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(window_width, window_height);
glutCreateWindow("Picture");



init();



glutDisplayFunc(display_func);
glutReshapeFunc(reshape_func);



glutMainLoop();



free(content);



return 0;
}



显示结果


libpng的PNG图片读取


推荐阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇教你如何使用libpng显示PNG图片 下一篇VC6 下 libpng 库的编译与初步使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: