linux 读取png图片大小,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;

}

显示结果

71dc87ec2f49c6dd73ddb377195e27e3.png

libpng 的详细介绍:请点这里

libpng 的下载地址:请点这里

推荐阅读:

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值