libpng的PNG图片读取,该程序只支持RGBA方案的PNG图片不支持PNG其他方案特性
#include <stdio.h>
#include <stdlib.h>
#include <GL\glew.h>
#include <GL\glut.h>
#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;
}
显示结果