注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

太阳神上的博客

青青子衿,悠悠我心,但为君故,沉吟至今。

 
 
 

日志

 
 
 
 

libpng使用感  

2007-08-17 08:22:23|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  PNG格式是由网景公司推出的一种图像格式,非常优秀,而专门处理这种格式有一个库叫libpng,听这个名字就觉得很definitive,还专门有一个这样的网站在维护,这是一个开源的跨平台的库。一般在Linux里就自带了这个,当然名字还得加些版本号。据它的官方网站称,这个库已成功且广泛地使用了十二年。
  要FLTK 2.0处理png图像的pngImage类有些问题,它不能正确地得到图像的大小,追本溯源,pngImage的基础就是libpng,于是要解决这个问题,如果弄明白了libpng,也许就有希望了。现在用开源的东西多了,感觉各个开源工程的网站大都风格比较朴素,没什么很花的东西。一般主页上几个链接都是并不可少的,例如“下载”,“文档”等。一般我是先下载安装,再通过它的文档再使用。因为我只是使用libpng,而libpng已经在电脑里安装好了,所以这次我只须看文档了。
  开源的文档也无非几种,HTML网页格式的,PDF格式的,还有CHM或DOC格式的,一般肯定有英文版,鲜有中文版。开源的文档风格还行,一般讲得很清晰,往往还有一些现成的例子供下载。我先是看了网站上的说明,也基本了解个大概,libpng还需要另外一个解压库zlib,这个库也是相当有名且运用很广的。一般这种库都是C库,没有用C++还进行封装,不过说实在的,即使是C++库,其很多风格也都是C的,典型的就是FLTK。用C的一个坏处是由于没有封装,使得所有的函数名字大都很长,都有一个前辍,像这个libpng,函数名前辍就是png_,而宏前辍就是PNG_,而由于没有异常处理,经常要通过返回值来判断错误,很麻烦,可读性也差。
  我前面看了半天,然后再下载例子用Dev-C++进行了一些测试,终于了解了如何通过libpng来获取文件的大小,png格式说起来还是很复杂的,我不想再深入,所以只看了前面一点点弄明白后就停下了。下面是相应的代码:
#include <stdio.h>
#include <png.h>
 
int main(){

    
FILE *fp=fopen("fire.png","rb");

    
unsigned char sig[8];

    
fread(sig,1,8,fp);
    
    
if(png_check_sig(sig,8))

        
printf("This is a png file\n");

    
else{

        
printf("This is not a png file\n");

        
return 1;

    
}

    
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);

    
png_infop info_ptr = png_create_info_struct(png_ptr);

     
    
if (setjmp(png_jmpbuf(png_ptr))) {

        
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);

        
return 2;

    
}
   
     
    
png_init_io(png_ptr, fp);

    
png_set_sig_bytes(png_ptr, 8);

    
png_read_info(png_ptr, info_ptr);

    
png_uint_32 width=0,height=0;

    
int  bit_depth, color_type;

    
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,

      
NULL, NULL, NULL);

       
    
printf("width=%u height=%u\n",width,height);

    
fclose(fp);

    
return 0;

}


  评论这张
 
阅读(1039)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017