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);
}