园林景观设计公司质量环境职业健康安全管控,谷歌seo优化推广,wordpress缩略图模糊,网页升级中这个是在知乎上看到的大神写的文章#xff0c;如果是学习C语言入门的#xff0c;我觉得可以从这个入手#xff0c;特别是对图像感兴趣的。文章中提到的「我」#xff0c;指的是「Milo Yip」大神。1. 什么是png格式图片#xff1f;相对地#xff0c;PNG#xff08;Por… 这个是在知乎上看到的大神写的文章如果是学习C语言入门的我觉得可以从这个入手特别是对图像感兴趣的。文章中提到的「我」指的是「Milo Yip」大神。1. 什么是png格式图片相对地PNGPortable Network Graphics就是一个广为人知的图片格式。如果可以把影像直接储存成 PNG不是更理想么然而在 C/C 中写入 PNG 一般需要链接一些程序库例如 PNG 的标准参考程序库是 libpng。它很强大支持 PNG 所有功能但对于初学者而言配置、编译并学习如何使用这些程序库可能已足够打消动手的念头。可以简单一点么2. svpng为此我在周末尝试写一个极简的 C 函数 Github miloyip/svpngsave PNG 的缩写它仅能写入 24-bit RGB 或 32-bit RGBA、无压缩的 PNG。它只有一个 32 行代码的函数。github地址https://github.com/miloyip/svpng用法如下#include svpng.incvoid test_rgb(void) {unsigned char rgb[256 * 256 * 3], *p rgb;unsigned x, y;FILE *fp fopen(rgb.png, wb);for (y 0; y 256; y)for (x 0; x 256; x) {*p (unsigned char)x; /* R */*p (unsigned char)y; /* G */*p 128; /* B */}svpng(fp, 256, 256, rgb, 0);fclose(fp);
}
就会输出这个 rgb.png 文件这个函数的声明很简单缺省配置下是这样的/*!\brief 以 PNG 格式存储 RGB/RGBA 影像\param out 输出流缺省使用 FILE*。\param w 影像宽度。(16383)\param h 影像高度。\param img 影像像素数据内容为 24 位 RGB 或 32 位 ARGB 格式。\param alpha 影像是否含有 alpha 通道。
*/
void svpng(FILE* out, unsigned w, unsigned h, const unsigned char* img, int alpha);
相信这样的函数时使对初学者而言也极易使用。也不需要另外生成程序库只要复制到项目便可使用。3. 代码实现这里简单介绍实现要点对此没兴趣的读者也可略过。根据 Portable Network Graphics (PNG) Specification (Second Edition) 「www.w3.org」PNG 文件由多个 chunk 组成。每个 chunk 的类型以 4 个字符表示。最基本的 PNG 文件内容是8 字节 magic number用于识别 PNG 格式IHDRImage Header chunk描述影像的维度、色彩深度、色彩格式、压缩类型等IDATImage Datachunk存储影像的像素数据IENDImage EndchunkPNG数据流结束每个 chunk 的结构是chunk 内容长度4 字节chunk 类型4 字节chunk 内容chunk 的 CRC包括类型和内容PNG 里的数据是以大端big endian编码的但在 IDAT 中每个 block 的长度则以小端存储。另外实现的难点之一是要同时实现 CRC-32 及 Adler-32 校验和checksum的生成。编码实现如下文字版请移玉步至 svpng.inc为了减少代码大小使用宏去避免加入多个函数。另外为了简化实现把每一行像素写成一个 block这样可能会浪费一点空间但对于这函数而言也不是问题。4. 结语本文介绍了一个极简的 C 函数 svpng方便在 C/C 中把图像存储成 PNG 文件并简介了当中的实现。希望读者能利用此函数进入计算机图形学之门。文中的 inc 而不是.h是因为inc 是对方法的实现而不是简单的声明。unsigned char rgb[256 * 256 * 3] 可能有的人不明白为什么数组要这样声明一个像素点是通过{R,G,B}三色值表示的所以后面有一个3但是一张图片是包含有长和宽的也就是前面的256*256就是这张图片的长和宽。实际上的图片是这样排列的 { R, G, B, R, G, B, ... } 的形式从上至下左至右。#推荐阅读#专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号