libpng用法,读写PNG图像

第三方库介绍——libpng 阅读详情
//file:pngtest.c
//changed from the libpng,对照libpng中源码阅读
//myers
#include "png.h"
#include <stdio.h>
#include "zlib.h"
#include "png.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main(int argc,char* argv[])
{
    static png_FILE_p fpin;
      static png_FILE_p fpout;
    //输入文件名
    char *inname = "/home/mingming/graph/1.png";
    char *outname = "/home/mingming/graph/1_like.png";
    //读:
    png_structp read_ptr;
      png_infop read_info_ptr, end_info_ptr;
    //写
    png_structp write_ptr;
    png_infop write_info_ptr,write_end_info_ptr;
    //
    png_bytep row_buf;
    png_uint_32 y;
    int num_pass, pass;
    png_uint_32 width, height;//宽度,高度
    int bit_depth, color_type;//位深,颜色类型
    int interlace_type, compression_type, filter_type;//扫描方式,压缩方式,滤波方式
    //读
    row_buf = NULL;
    //打开读文件
    if ((fpin = fopen(inname, "rb")) == NULL)
    {
        fprintf(stderr,"Could not find input file %s\n", inname);
        return (1);
    }
    //打开写文件
    if ((fpout = fopen(outname, "wb")) == NULL)
    {
        printf("Could not open output file %s\n", outname);
        fclose(fpin);
        return (1);
    }
    //我们这里不处理未知的块unknown chunk
    //初始化1
    read_ptr =
              png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    write_ptr =
          png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    read_info_ptr = png_create_info_struct(read_ptr);
       end_info_ptr = png_create_info_struct(read_ptr);
    write_info_ptr = png_create_info_struct(write_ptr);
       write_end_info_ptr = png_create_info_struct(write_ptr);
    //初始化2
    png_init_io(read_ptr, fpin);
    png_init_io(write_ptr, fpout);
    //读文件有high level(高层)和low level两种,我们选择从底层具体信息中读取。
    //这里我们读取所有可选。
    png_read_info(read_ptr, read_info_ptr);    
    //(1)IHDR
      //读取图像宽度(width),高度(height),位深(bit_depth),颜色类型(color_type),压缩方法(compression_type)
    //滤波器方法(filter_type),隔行扫描方式(interlace_type)
    if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth,
      &color_type, &interlace_type, &compression_type, &filter_type))
    {
    //我们采用默认扫描方式
     png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth,
        color_type, PNG_INTERLACE_NONE, compression_type, filter_type);
    }
    //(2)cHRM
    //读取白色度信息  白/红/绿/蓝 点的x,y坐标,这里采用整形,不采用浮点数
    png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x,blue_y;

    if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y,
     &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y))
    {
     png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x,
        red_y, green_x, green_y, blue_x, blue_y);
    }
        //(3)gAMA
      png_fixed_point gamma;

      if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma))
         png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma);
        //(4)iCCP
    png_charp name;
    png_bytep profile;
    png_uint_32 proflen;

    if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type,
              &profile, &proflen))
    {
     png_set_iCCP(write_ptr, write_info_ptr, name, compression_type,
              profile, proflen);
    }
    //(5)sRGB
      int intent;
      if (png_get_sRGB(read_ptr, read_info_ptr, &intent))
         png_set_sRGB(write_ptr, write_info_ptr, intent);
    //(7)PLTE
      png_colorp palette;
      int num_palette;

      if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette))
         png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette);
    //(8)bKGD
      png_color_16p background;

      if (png_get_bKGD(read_ptr, read_info_ptr, &background))
      {
         png_set_bKGD(write_ptr, write_info_ptr, background);
      }
    //(9)hist
 
      png_uint_16p hist;

      if (png_get_hIST(read_ptr, read_info_ptr, &hist))
         png_set_hIST(write_ptr, write_info_ptr, hist);
       //(10)oFFs
      png_int_32 offset_x, offset_y;
      int unit_type;

      if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y,
          &unit_type))
      {
         png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type);
      }
    //(11)pCAL
      png_charp purpose, units;
      png_charpp params;
      png_int_32 X0, X1;
      int type, nparams;

      if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type,
         &nparams, &units, &params))
      {
         png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type,
            nparams, units, params);
      }
       //(12)pHYs
   
      png_uint_32 res_x, res_y;

      if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y, &unit_type))
         png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type);
   //(13)sBIT
      png_color_8p sig_bit;

      if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit))
         png_set_sBIT(write_ptr, write_info_ptr, sig_bit);
    //(14)sCAL
      int unit;
      png_charp scal_width, scal_height;

      if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width,
          &scal_height))
      {
         png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width,
             scal_height);
      }
        //(15)iTXt
      png_textp text_ptr;
      int num_text;

      if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0)
      {
         png_set_text(write_ptr, write_info_ptr, text_ptr, num_text);
      }
    //(16)tIME,这里我们不支持RFC1123
      png_timep mod_time;

      if (png_get_tIME(read_ptr, read_info_ptr, &mod_time))
      {
         png_set_tIME(write_ptr, write_info_ptr, mod_time);
      }
    //(17)tRNS
      png_bytep trans_alpha;
      int num_trans;
      png_color_16p trans_color;

      if (png_get_tRNS(read_ptr, read_info_ptr, &trans_alpha, &num_trans,
         &trans_color))
      {
         int sample_max = (1 << bit_depth);
         /* libpng doesn't reject a tRNS chunk with out-of-range samples */
         if (!((color_type == PNG_COLOR_TYPE_GRAY &&
             (int)trans_color->gray > sample_max) ||
             (color_type == PNG_COLOR_TYPE_RGB &&
             ((int)trans_color->red > sample_max ||
             (int)trans_color->green > sample_max ||
             (int)trans_color->blue > sample_max))))
            png_set_tRNS(write_ptr, write_info_ptr, trans_alpha, num_trans,
               trans_color);
      }
    
    //写进新的png文件中
    png_write_info(write_ptr, write_info_ptr);
    //读真正的图像数据
    num_pass = 1;
   for (pass = 0; pass < num_pass; pass++)
   {
      for (y = 0; y < height; y++)
      {
    //分配内存
         row_buf = (png_bytep)png_malloc(read_ptr,
            png_get_rowbytes(read_ptr, read_info_ptr));
    png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1);
    png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
         png_free(read_ptr, row_buf);
         row_buf = NULL;
      }
   }
    //结束
   png_read_end(read_ptr, end_info_ptr);
    //
    //tTXt
      if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0)
      {
         png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text);
      }
    //tIME
      if (png_get_tIME(read_ptr, end_info_ptr, &mod_time))
      {
         png_set_tIME(write_ptr, write_end_info_ptr, mod_time);
      }
    //
    png_write_end(write_ptr, write_end_info_ptr);
    //回收
    png_free(read_ptr, row_buf);
    row_buf = NULL;
    png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr);
    png_destroy_info_struct(write_ptr, &write_end_info_ptr);
    png_destroy_write_struct(&write_ptr, &write_info_ptr);
    //
   fclose(fpin);
   fclose(fpout);
    //测试,比较两个PNG文件是否相同
   if ((fpin = fopen(inname, "rb")) == NULL)
   {
      printf("Could not find file %s\n", inname);
      return (1);
   }

   if ((fpout = fopen(outname, "rb")) == NULL)
   {
      printf("Could not find file %s\n", outname);
      fclose(fpin);
      return (1);
   }
   char inbuf[256], outbuf[256];
   for (;;)
   {
      png_size_t num_in, num_out;

         num_in = fread(inbuf, 1, 1, fpin);
         num_out = fread(outbuf, 1, 1, fpout);

      if (num_in != num_out)
      {
         printf("\nFiles %s and %s 大小不同\n",
                 inname, outname);

         fclose(fpin);
         fclose(fpout);
         return (0);
      }

      if (!num_in)
         break;

      if (memcmp(inbuf, outbuf, num_in))
      {
         printf("\nFiles %s and %s 内容不同\n", inname, outname);
         fclose(fpin);
         fclose(fpout);
         return (0);
      }
   }

   fclose(fpin);
   fclose(fpout);

   return (0);

}
使用libpng读写PNG图片 libpng是一款C语言编写的比较底层的读写PNG文件的跨平台的库。借助它,你可以轻松读写PNG文件的每一行像素。 因为PNG文件是经过压缩而且格式复杂的图形文件(有的PNG文件甚至像GIF文件一样带动画效果) 而且PNG可以是带透明通道的真彩色图像、不带透明通道的真彩色图像、索引颜色、灰度颜色等各种格式,如果大家都自己写程序分析PNG文件就会显得很麻烦、很累。因此,通过使用libpng你就能直接... 阅读详情

相关推荐

操作png图片文件——libpng库——C++

【代码】操作png图片文件——libpng库——C++

mankeywang的博客 3172

Libpng源码的使用

上一篇讲了libpng和zlib的关系 zlib,Libpng,gzip,libzip库的联系与区别 接下来记录libpng的使用 准备 首先了解png,bmp文件格式的特点,本篇不详细介绍。 bmp图片是微软的图片格式,就是原始的像素数据加上bmp文件头组成,像素数据是倒装的,即第一个像素的(RGB)三个字节再原始文件的最后。png是原始数据压缩后加入png格式文件描述。 下载libpng和zlib的源码,放在同一个目录中 由于libpng实际上使用的是zlib的算法,libpng是zl

cc电子世界 5615

使用libpng读取PNG图片像素数据

libpng 是一套免费的、公开源代码的程序库,支持对 PNG 图形文件的创建、读写等操作。可以到www.libpng.org 上下载源代码。libpng 使用 zlib 程序库作为压缩引擎,zlib 也是著名的 gzip (GNU zip) 所采用的压缩引擎。zlib是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)。

2万+

libpng使用

libpng使用

whl0071的专栏 2468

【开源库 | libpng】深入解析 libpng 的 PNG 文件读写机制与实战技巧

本文深入解析了开源库libpng的PNG文件读写机制与实战技巧,详细介绍了PNG文件结构、libpng核心数据结构以及高效的读写流程。通过代码示例展示了如何优化性能、处理透明通道和大文件内存管理,帮助开发者掌握libpng的高级应用。

weixin_27960253的博客 190

libpng PNG图片库深入掌握

在数字图像处理领域,PNG(Portable Network Graphics)格式由于其开放性、无损压缩和透明度支持等特性,成为了网络上广泛使用的图像格式。libpng是一个开源的PNG图像格式库,它为开发者提供了读取和写入PNG文件的C语言接口。该库的重要性不仅体现在它与PNG标准的严格兼容,还在于其高效、跨平台的特性,使得图像处理软件能够轻松集成对PNG格式的支持。在本章节中,我们将探讨libpng库的基本介绍,包括它的功能和为什么它对IT行业如此重要。

weixin_26850469的博客 1186

图像解码之二:使用libpng解码png图片

上文《图像解码之一——使用libjpeg解码jpeg图片》介绍了使用libjpeg解码jpeg图片。png图片应用也非常广泛,本文将会简单介绍怎样使用开源libpng库解码png图片。 libpng的数据结构     png_structp变量是在libpng初始化的时候创建,由libpng库内部使用,代表libpng的是调用上下文,库的使用者不应该对这个变量进行访问。调用li

GG之家 5823

STM32版CCD线性摄像头寻线寻迹小车_stm32接ccd

目前大多数的小车寻线寻迹都是用红外对管寻线,这是比较简单也比较成熟的技术方案,且成本也低。本文将介绍使用CCD线性摄像头寻线寻迹。TSL1401 线性传感器由一个 1x128 的光电二极管阵列、相关的电荷放大电路以及一个内部像素数据保功能组成。内部像素数据保功能可以为所有像素点提供同时积分的开始和停止时间。该阵列由 128 个像素组成,每个像素的感光面积为 3,524.3 平方微米。像素之间的间隔为 8μm。内部控制逻辑简化了操作,该模块需要串行输入(SI)信号和时钟信号(CLK)。

2401_87557129的博客 3229

如何使用LIBPNG:快速上手PNG图像编解码的终极教程

LIBPNG是一款强大的PNG图像编解码库,它提供了完整的PNG图像处理功能,支持各种颜色模式、透明度和压缩算法。本文将带你快速掌握LIBPNG的核心使用方法,从环境搭建到实际应用,让你轻松处理PNG图像文件。 ## 一、LIBPNG简介 LIBPNG(Portable Network Graphics support library)是一个开源的PNG图像编解码库,它实现了PNG图像格式的完

gitblog_01111的博客 651

CCC数字钥匙Release 3实战:如何用BLE/UWB实现无钥匙进入(附避坑指南)

本文深入解析CCC数字钥匙Release 3标准下BLE/UWB无钥匙进入系统的开发实践,涵盖硬件选型、安全测距协议、时序同步等关键环节,并提供实战调试技巧与安全攻防案例。特别针对BLE芯片配置、UWB模块选型等常见陷阱给出解决方案,帮助开发者高效实现厘米级精度的数字钥匙系统。

weixin_29326909的博客 256

深入解析CRC-16校验算法及其Verilog硬件实现

本文深入解析了CRC-16校验算法的原理及其在Verilog中的硬件实现方法。从基础的模2除法到串行和并行实现方案,详细介绍了LFSR结构、状态转移分析以及工业应用中的优化技巧。通过实际案例和性能对比,帮助开发者理解如何选择适合的CRC实现方案,确保数据传输的可靠性。

yolo5detector的博客 322

linux下使用cmake和libpng来对png图像进行读写

在进行图像处理操作之前,首要任务是确保能够正确地读取图像。编写纯 C 语言代码进行图像处理时,不太适宜使用 OpenCV2。因此,为了遵循标准且便于操作,我们采用 libpng 的代码库来实现对 PNG 图像的读写。之所以选择在 Linux 系统下进行此项操作,主要是因为许多库在 Linux 环境下的安装更为便捷,例如 libpng。而在 Windows 系统下,需要下载源码、进行编译以及配置路径等一系列操作,极为繁琐,这与我们进行算法学习的初衷背道而驰。

wumingshi159的博客 744

提示词编写:从新手到专家的进阶之路

本文旨在为提示词编写者提供一条从新手到专家的进阶之路。我们将详细探讨提示词编写的背景与意义、基础与进阶技巧、实战应用以及最佳实践。通过逐步深入的分析与实操,读者将掌握提示词编写的核心要点,提高编写效率和作品质量。提示词是用于引导人工智能生成文本的关键词或短语,它包含了作者想要传达的主题、情感和细节。随着人工智能技术的普及,自动化写作工具逐渐应用于各行各业。为了提高写作效率,项目团队决定开发一款基于人工智能的自动化写作工具。成功开发了一款自动化写作工具,生成文本质量较高。

AI天才研究院 1087

图像解码之二——使用libpng解码png图片

图像解码之二——使用libpng解码png图片

whl0071的专栏 1272

电能质量仿真:电能质量改善措施仿真_(12).电能质量改善措施综合仿真案例

假设我们有一个微电网系统,该系统包含分布式电源(如光伏板、风力发电机)、储能设备、负荷和电网连接。电压波动:由于负荷的波动和分布式电源的间歇性输出,系统电压出现了不稳定的情况。谐波污染:非线性负荷和逆变器的运行导致系统中出现了显著的谐波污染。频率偏差:分布式电源的波动和负荷的突变导致系统频率出现了偏差。我们需要通过仿真来评估这些问题的影响,并提出相应的改善措施。

2401_87715305的博客 1360

在Qt中集成VTK和PCL:实现数据可视化的完整指南

在现代软件开发中,数据可视化至关重要。将VTK(Visualization Toolkit)和PCL(Point Cloud Library)集成到Qt环境里,能为开发者提供强大的可视化解决方案。本文将深入讲解如何在Qt中读取PCL文件,展示VTK模型和PCL数据,适合想要在Qt项目中实现数据可视化的开发者。

轩宇的博客 917

利用libpng中的函数读写png文件

用于读写png图片文件的代码。

你访问的页面已存在 3万+

2024年上半年试题二:论性能测试方法及其应用

2025年1月,我以系统分析师的身份参与了公司OA系统的开发与建设。该系统包含的功能有打卡签到、公文流转、工资查询等。我们吸取了之前由于系统使用人数激增暴露出的短时间卡顿等问题,所以在本次开发中,我们非常重视系统的性能测试。通过自动化的测试工具模拟多种正常、峰值及异常负载条件对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样,常见的负载测试和压力测试都属于性能测试。

银帅 548

LIBPNG读写PNG文件

分享一下我使用的代码,以下是读取png图片文件的代码: #include #include   #include /******************************图片数据*********************************/ typedef struct _pic_data pic_data; struct _pic_da

970

【系统分析师】核心考点:100个高频知识点汇总

本文系统梳理了系统分析师考试的11大领域高频考点,重点解析了计算机硬件与体系结构的7个核心知识点:计算机五大部件(CPU/存储器/总线等)、校验码类型(奇偶/海明/CRC)、CISC与RISC指令系统对比、总线分类与特性、RAID磁盘阵列级别、流水线技术原理及Flynn系统分类法。内容涵盖硬件组成、数据校验、指令架构、存储技术等关键概念,通过表格对比和公式说明,为考生提供结构化的知识框架与备考重点。

数据知道的博客 5572

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LIBPNG读写PNG图像

//file:pngtest.c //changed from the libpng,对照libpng中源码阅读 //myers #include "png.h" #include #include "zlib.h" #include "png.h" #include #include #include int main(int argc,char* argv[]) { stat

Augusdi的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

zlib 与 libpng 的配置与使用 part 3 libpng的安装与生成PNG图片

libpng 的安装接下来,安装 libpng 的过程要稍微轻松些。先下载最新的 libpng 程序库源文件。网址是http://sourceforge.net/projects/libpng/或http://www.libpng.org/pub/png/。不妨设下载的文件是 libpng-1.2.5.tar.gz,将这个文件释放到D:/libpng/。修改D:/libpng/libpng

陈硕的Blog 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

libpng读写png图片

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <png.h> #define pngFilePath "xxx.png" int main(void) { FILE *fp_read = fopen(pngFilePath, "rb"); png_structp png_read = png_create_read_struct(PNG_LIBPNG_VER_

xlbtlmy的博客 1300
上一篇: 使用libpng显示png图片
下一篇: CoInitialize和CoInitializeEx的区别
HiRuyue
博客等级 码龄14年 47粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值