PNG 文件简单解析 和 libpng的简单实用

本文详细介绍了PNG文件的数据格式及其组成部分,并提供了一段C语言代码示例用于读取PNG文件并解析其图像数据。此外,还分享了解决libpng库安装及使用过程中遇到的问题的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PNG 文件格式
89 50 4E 47 0D 0A 1A 0A    表示PNG的数据格式
00 00 00 0D                IHDR 文件头数据的长度
49 48 44 52                IHDR 表示
00 00 00 01 00 00 00 01    表示图像的宽高
08                         色深  2^8 = 256 位的调色板颜色
02                         颜色类型  索引图像 真彩色图像
00                         压缩算法
00                         滤波器方法
00                         表示非间隔扫描 
90 77 53 DE                表示CRC校验
00 00 00 04              
67 41 4D 41                gAMA值 可能跟伽马数值相关  辅助数据块
00 00 B1 8F                ??


00 00 00 00 49 45 4E 44 AE 42 60 82 IEND 结束位置
w3c 表示的是比较详细的但是这些东西。说实话 很难全面理解。

实用libpng的话比较容易读取矩阵数据。

个人烦了一个错误。导致进度极其缓慢。
因为刚开始,我的电脑是64位的win10 +ubuntu 然后现在ubuntu中安装了  libpng 1.6  可能是觉得不放心。我 ./configure [--pix...]这个路径没有加上
然后我安装了两此,结果就悲剧了。。。
有打算在windows 上面搞,可是  visual stdio 的加入 dll 目录啥的看起来好麻烦。。。
搞了好久在一个论坛上找到了勉强的解决方案下载 libpng1.5版本。
然后又报错。
从网上知道了,第三方的库  编译啥的。 转载自错误划重点
gm: error while loading shared libraries: libpng15.so.15: cannot open shared object file: No such file or directory

安装gm库产生问题

解决方案:

1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令

ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.

2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:

# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig

然后问题就迎刃而解了。
工作中难免压力大,解决问题的能力可不能随着压力的增大而放弃。保持一个平常心。很重要哈。
记住编译的命令是 gcc xxx.c -lpng 或许后面还有一个什么
抄了一个PNG读取数组的代码,好像是抄的

优快云博主

#include "png.h"
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "zlib.h"
#define PNG_BYTES_TO_CHECK 4
#define _POSIX_SOURCE 1

void read_png(char *file_name)  /* We need to open the file */
{
   png_structp png_ptr;
   png_infop info_ptr;
   int i;
   png_bytep* row_pointers;
   int sig_read = 0;
   char buf[PNG_BYTES_TO_CHECK];
   png_uint_32 width, height;
   int bit_depth,  interlace_type;
   FILE *fp;
   int w, h, x, y, temp, color_type;
   int buffer[500000] = {0};
   int count = 0;
   int png_transforms;
   if ((fp = fopen(file_name, "rb")) == NULL)
      return ;

   png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
   /* 为这个结构体分配空间 存储这图像的信息*/
   info_ptr = png_create_info_struct(png_ptr);
   setjmp( png_jmpbuf(png_ptr) );
   /* 若读到的数据并没有PNG_BYTES_TO_CHECK个字节 */
   temp = fread( buf, 1, PNG_BYTES_TO_CHECK, fp );
   if( temp < PNG_BYTES_TO_CHECK ) {
                fclose(fp);
                png_destroy_read_struct( &png_ptr, &info_ptr, 0);
                printf("没有充足的字节\n");
                return /* 返回值 */;
     }
   temp = png_sig_cmp( (png_bytep)buf, (png_size_t)0, PNG_BYTES_TO_CHECK );
   if( temp != 0 ) {
                fclose(fp);
                printf("不匹配字符串\n");
                png_destroy_read_struct( &png_ptr, &info_ptr, 0);
                return /* 返回值 */;
      }
   /* 复位文件指针 */
   rewind( fp );
   /*如果我们已经读取了这些信息  跳过相应的函数*/
   /* 开始读文件 */
   png_init_io(png_ptr, fp);
   /* 获取图像的色彩类型 */
   png_read_png(png_ptr, info_ptr, png_transforms, NULL);
   color_type = png_get_color_type( png_ptr, info_ptr );
   /* 获取图像的宽高 */
   //color_type = info_ptr->color_type;
   w = png_get_image_width( png_ptr, info_ptr );
   h = png_get_image_height( png_ptr, info_ptr );
   /* 获取图像的所有行像素数据,row_pointers里边就是rgba数据 */
   row_pointers = png_get_rows( png_ptr, info_ptr );
           /* 根据不同的色彩类型进行相应处理 */
    switch( color_type ) {
    case PNG_COLOR_TYPE_RGB_ALPHA:
            for( y=0; y<h; ++y ) {
                    for( x=0; x<w*4; ) {
                            /* 以下是RGBA数据,需要自己补充代码,保存RGBA数据 */
                            /* 目标内存 */buffer[count++] = row_pointers[y][x++]; // red
                            /* 目标内存 */buffer[count++] = row_pointers[y][x++]; // green
                            /* 目标内存 */buffer[count++] = row_pointers[y][x++]; // blue
                            /* 目标内存 */buffer[count++] = row_pointers[y][x++]; // alpha
                    }
            }
            break;

    case PNG_COLOR_TYPE_RGB:
            for( y=0; y<h; ++y ) {
                    for( x=0; x<w*3; ) {
                            /* 目标内存 */buffer[count++] = row_pointers[y][x++]; // red
                            /* 目标内存 */buffer[count++] = row_pointers[y][x++]; // green
                            /* 目标内存 */buffer[count++] = row_pointers[y][x++]; // blue
                    }
            }
            break;
    /* 其它色彩类型的图像就不读了 */
    default:
            fclose(fp);
            temp = PNG_COLOR_TYPE_RGB_ALPHA;
            printf("其他格式不读了%d \n", color_type);
            png_destroy_read_struct( &png_ptr, &info_ptr, 0);
            return /* 返回值 */;
    }
   /* One of the following I/O initialization methods is REQUIRED */
    for(i = 0; i < 200 ; i++)
    {
       printf("%d ",buffer[i]);
    }
    png_destroy_read_struct( &png_ptr, &info_ptr, 0);
    return 0;

}

int main(int argc, char** argv)
{

   FILE *fp;
   int temp = 0;
   char buf[PNG_BYTES_TO_CHECK];
   /* 打开源头文件 */
   if ((fp = fopen(argv[1], "rb")) == NULL)
      return 0;

   /* 读取标志位 如果不是png文件退出 */
   if (fread(buf, 1, PNG_BYTES_TO_CHECK, fp) != PNG_BYTES_TO_CHECK)
   {
       printf("Sorry,it is not the png file");
       return 0;
   }
   else
   {
       // 非0 表示匹配
       temp = (!png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK));
       printf("yes ,goog luck %d \n ", temp);
   }
   read_png(argv[1]);
    //printf("%d",check_if_png("hei.png",fp));
    return 0;
}
 

有很多博客介绍这些信息但是难免这些信息介绍的不全面。

如果知道如何把安装好的libpng库完全从计算机中删除掉的话,请留言。</>
w3c关于PNG的介绍,最好用google翻译看一下
转载:错误划重点

链接生成静态可执行文件
 g++ test.cc -lpng16 -lz -L/usr/local/lib -static -o PNG_TO_H.static

转载于:https://www.cnblogs.com/eat-too-much/p/7261216.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值