如何用libpng输出一个png图片?

/* Copyright (c) 2013 Frank Ham and Phuc Quang */
#include <iostream>
#include <string>
#include <png.h>using namespace std;#ifndef PNG_WRITER_HPP
#define PNG_WRITER_HPP// Sample usage:
//    PngWriter png(nx,ny);
//    // then one or more calls to...
//    png.set(i, j, red, green, blue); // 0 <= red,green,blue <= 255
//    png.write("myfile.png");
//      at this point you can change the image and write again...
//    png.set(i, j, red, green, blue);
//    png.write("myfile2.png");
class PngWriter {
private:unsigned char (*buffer)[3]; // 0 <= r,g,b < 255 int nx,ny;
public:PngWriter(const int width,const int height) {nx = width;ny = height;buffer = new unsigned char[nx*ny][3];for (int i = 0; i < nx*ny; ++i) {//cyanbuffer[i][0] = 73;buffer[i][1] = 175;buffer[i][2] = 205;}}~PngWriter() {delete[] buffer;}/*给某一点的像素赋值*/void set(const int i,const int j,const unsigned char r,const unsigned char g,         const unsigned char b) {buffer[(ny-j-1)*nx+i][0] = r;buffer[(ny-j-1)*nx+i][1] = g;buffer[(ny-j-1)*nx+i][2] = b;}/*修复原作者的char **/void write(string filename) {FILE * fp = fopen(filename.c_str(),"wb");if (!fp) {std::cout << "Warning: could not open png file: " << filename << std::endl;return;}png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,(png_voidp)NULL,NULL,NULL);if (!png_ptr) {fclose(fp);std::cout << "Warning: could not create png_ptr" << std::endl;return;}png_infop info_ptr = png_create_info_struct(png_ptr);if (!info_ptr) {png_destroy_write_struct(&png_ptr,(png_infopp)NULL);std::cout << "Warning: could not create info_ptr" << std::endl;return;}png_init_io(png_ptr, fp);png_set_IHDR(png_ptr, info_ptr,nx, ny,             // width, height8,                  // bits per pixel -- 16 does not work with blockbusterPNG_COLOR_TYPE_RGB, // non-alpha options are PNG_COLOR_TYPE_RGB,PNG_COLOR_TYPE_GRAY,PNG_INTERLACE_NONE,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);/* Some bits per pixel notes: 16 does not work with blockbuster, and there are also
         issues with PNG_COLOR_TYPE_GRAY interpretation, so stick to 8 and PNG_COLOR_TYPE_RGB
         for now. Note that if you do use 16, pay attention to MSB/LSB order. Endian is
         flipped on my linux workstation... */png_write_info(png_ptr, info_ptr);// set up row pointers to point into the raw image data in buffer...png_byte * row_pointers[ny];for (int i = 0; i < ny; ++i)row_pointers[i] = (png_byte*)(buffer + i*nx);png_write_image(png_ptr, row_pointers);png_write_end(png_ptr, NULL);png_destroy_write_struct(&png_ptr, &info_ptr);fclose(fp);}
};
#endif// g++ main.cpp -lpng
int main(int argc,char * argv[])
{PngWriter png(800,600);// set some pixels....for (int i = 0; i < 800; ++i)for (int j = 0; j < 600; ++j)png.set(i,j,i+j,i-j,j-i); // then write...png.write("sample1.png");for (int i = 400; i < 500; ++i)for (int j = 200; j < 300; ++j)png.set(i,j,10,10,10);png.write("sample2.png");
}

我的环境:cygwin,g++ (GCC) 7.3.0

编译,运行

$ g++ main.cpp -lpng$ ./a.exe

结果

如何用libpng输出一个编辑后的png图片?相关推荐

  1. python输出斐波那契数列_python面试题之如何用Python输出一个斐波那契数列

    [BZOJ1623] [Usaco2008 Open]Cow Cars 奶牛飞车 贪心 SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. ...

  2. python面试题之如何用Python输出一个斐波那契数列

    so eary! 1 a,b = 0, 1 2 while b<100: 3 print (b), 4 a, b = b, a+b 本文转载自:python黑洞网 原文链接:http://www ...

  3. 如何用JAVA制作一个漂亮的表格

    如何用JAVA制作一个漂亮的表格 表格图片: 选中一行时高亮显示,且字体变为红色: 在表格中添加数据: 代码如下: import java.awt.BorderLayout; import java. ...

  4. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

    题目描述 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参.输出已交换后的两个值. 输入 两个数,空格隔开 输出 交换后的两个数,空格隔开 样例输入 1 2 样例输出 2 ...

  5. ACMNO.27 Python的两行代码解决 C语言-字符逆序 写一函数。使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。 输入 一行字符 输出 逆序后的字符串

    题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串. 输入 一行字符 输出 逆序后的字符串 样例输入 123456abcdef 样例输出 fedcba654321 来源 ...

  6. 百度编辑器ueditor每次编辑后多一个空行的解决办法

    用ueditor进行编辑文章时,每次编辑后文章前面都会多出一个空行. <script id="editor" type="text/plain" styl ...

  7. 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。

    题目要求: 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值.在main函数中输入一行字符串,分别调用两个函数,输出反序后的 ...

  8. 7-20 字符串逆序 输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

    输入格式: 输入在一行中给出一个不超过80个字符长度的.以回车结束的非空字符串. 输出格式: 在一行中输出逆序后的字符串. 输入样例: Hello World! 结尾无空行 输出样例: !dlroW ...

  9. 字符串逆序输出c语言,5、输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。...

    举例: #include int main() { int i, j, cnt; char ch, a[80], b[80]; ch=getchar(); for(i=0; ch!='\n'; i++ ...

最新文章

  1. Ios生产证书申请(含推送证书)
  2. Kafka最全面试题整理|划重点要考
  3. Java里String.split需要注意的用法
  4. 微信小应用资源汇总整理
  5. keyevent 封装_adb shell input keyevent 控制按键输入的数值(收藏版)
  6. 蠕虫病毒往往是通过进入计算机系统,2012年甘肃省三职生计算机考试题
  7. 蓝桥杯 基础练习 报时助手
  8. 果你的浏览器关闭了 java,weblogic之CVE-2018-3191漏洞分析
  9. 命名管道的使用方式:消息模式/字节模式
  10. 找回WordPress登录密码的方法
  11. 仲裁时,年假有效期两年
  12. linux qt安装包下载链接
  13. VS-RK3399 and VS-RK3288 Audio 开发指南
  14. 自学python能做erp吗_erp系统可以自学吗?应该怎么学习?
  15. Office安装成功之后,.ppt的文档图标显示不正常,怎么解决?
  16. 东南大学破格保研挂科_兜兜转转终入四牌楼——东南大学保研心得
  17. 手机双摄像头原理及产业解析
  18. CSAPP第四章家庭作业参考答案
  19. 推断车祸事件论文matlab,预测模型论文,关于基于优化GM(1,1)模型的水上交通事故预测相关参考文献资料-免费论文范文...
  20. Light OJ 1129 Consistency Checker

热门文章

  1. Java并发编程-wait和notify原理剖析
  2. css3--弹性布局
  3. Fabric chaincode开发调试
  4. PHP中获取星期的几种方法
  5. Android 中文API (68) —— BluetoothClass.Service
  6. 使用RegularExpressionValidator验证(转)
  7. Leanote使用mysql_《搭建个人Leanote云笔记本》阿里云体验实验室 教程
  8. python去重计数_用Python实现透视表的value_sum和countdistinct功能
  9. php教程 二叉树,PHP ClassObject -- PHP 自排序二叉树的深入解析
  10. java 执行js selenium_如何在Selenium WebDriver Java中使用JavaScript