Java在linux新建png_教你如何使用libpng显示PNG图片

libpng是一个跨平台的png解码库,方便易用。我这里不说它怎么移植,基本上如果是支持fopen之类函数的平台都可以支持。其实他的移植非常简单,zlib可能麻烦一点,但相信一般人都能搞定。主要是文件读写和错误处理的试配。

这里只提供一个使用libpng得到文件RGB(A)数据的例子,没加任何的错误处理:

void readpng__001(char* name)

{

// 前边几句是扯淡,初始化各种结构

FILE* file = fopen(name, "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);

// 得到文件的宽高色深

int m_width = png_get_image_width(PngPtr, InfoPtr);

int m_height = png_get_image_height(PngPtr, InfoPtr);

int color_type = png_get_color_type(PngPtr, InfoPtr);

// 申请个内存玩玩,这里用的是c++语法,甭想再c上编过

int size = m_height * m_width * 4;

unsigned char* bgra = new unsigned char[size];

int pos = 0;

// row_pointers里边就是传说中的rgba数据了

png_bytep* row_pointers = png_get_rows(PngPtr, InfoPtr);

// 拷贝!!注意,如果你读取的png没有A通道,就要3位3位的读。还有就是注意字节对其的问题,最简单的就是别用不能被4整除的宽度就行了。读过你实在想用,就要在这里加上相关的对齐处理。

for(int i = 0; i < m_height; i++)

{

for(int j = 0; j < (4 * m_width); j += 4)

{

bgra[pos++] = row_pointers[i][j + 2]; // blue

bgra[pos++] = row_pointers[i][j + 1]; // green

bgra[pos++] = row_pointers[i][j];  // red

bgra[pos++] = row_pointers[i][j + 3]; // alpha

}

}

// 好了,你可以用这个数据作任何的事情了。。。把它显示出来或者打印出来都行。

png_destroy_read_struct(&png_ptr, &info_ptr, 0);

fclose(file);

return;

}

libpng 的详细介绍:请点这里

libpng 的下载地址:请点这里

推荐阅读:

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值