libpng 的学习使用浅谈(1)

       libpng 主要功能就是用来处理png文件,所以,前提要保证你所io的文件一定一个png格式的文件 。libpng自身提供了一个方法,在对png文件做处理之前,先对文件进行检查:

         png_sig_cmp(png_bytep sig, // 一个字节数组

                         png_size_t start,  //开始位置

                         png_size_t num_to_check) ; //需要检查的字节个数

这个方法通过检查文件的第一个到第8个字节,来判断该文件是否是png文件,返回零,所提供的字节匹配的8字节的PNG签名,否则返回非零值。如果num_to_check==0或start>7总是会失败(即返回非零)。 

char head[8] = {0};

FILE* fp = fopen(file_name,"rb");
if(!fp)
{
    return (ERROR);
}
fread(header,1,number,fp);
int is_png = png_sig_cmp(header,0,number);
if( is_png != 0)
{
    return (NOT PNG FILIE!);
}

 

---------------------------------------------------------------------------------------------------------------------------

    接下来就是两个很重要的结构,需要进行初始化

    png_struct 

     png_info

  为了确保这两个结构的初始化正确 有专门的两个函数在初始化这两个类型的结构

   png_create_read_struct(

                                      PNG_LIBPNG_VER_STRING,// lib的库版本

                                       (png_voidp)user_error_ptr,    // 处理错误指针(可选)

                                       user_error_fn,                         // 错误处理函数   (可选)            

                                      user_warning_fn);                   // 警告处理函数   (可选)

 除了第一个参数以外 其他三个参数可以都设置为NULL,这样程序会调用默认的错误处理函数

调用这个方法 会返回分配一个分配的结构png_struct 对象 ,如果失败了 会返回一个NULL,所以当

调用这个方法 ,在使用对象前,一定要先判断一下是否是正确的。

 

   方法   png_create_info_struct(png_struct png_ptr)  用来初始化 png_info 对象

    需要的参数是 上面初始化好的png_struct 对象 

    在得到的返回对象  也一定要判断一下是否初始化成功,不成功返回NULL;

<span style="font-size:18px;"> <span style="color:#3333ff;">png_structp</span> png_ptr = <span style="color:#cc0000;">png_create_read_struct</span>(<span style="color:#cc33cc;">PNG_LIBPNG_VER_STRING</span>, </span>
<span style="font-size:18px;">                                          (png_voidp)user_error_ptr,
                                      user_error_fn, user_warning_fn);
<span style="color:#3333ff;">if</span> (!png_ptr)
<span style="color:#3333ff;">	return</span> (ERROR);</span>
<span style="color:#3333ff;">png_infop</span> info_ptr = <span style="color:#cc0000;">png_create_info_struct</span>(png_ptr);
<span style="color:#3333ff;">if</span> (!info_ptr)
{
<span style="color:#3333ff;">	</span><span style="color:#cc0000;">png_destroy_read_struct</span>(&png_ptr,(png_infopp)NULL, (png_infopp)NULL);
<span style="color:#3366ff;">	return</span> (ERROR);
}
<span style="color:#3333ff;">png_infop</span> end_info =<span style="color:#cc0000;"> png_create_info_struct</span>(png_ptr);
<span style="color:#3333ff;">if</span> (!end_info)
{
<span style="color:#cc0000;">	png_destroy_read_struct</span>(&png_ptr, &info_ptr,(png_infopp)NULL);
<span style="color:#3333ff;">	return</span> (ERROR);
}
 
 

 


 

 

 

 

 

 

   

 


        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值