stb_image & stb_image_write库 简单介绍

Github: https://github.com/nothings/stb/

stb_image

stb的库像素数据都是从左到右,从上到下存储

使用 stbi_set_flip_vertically_on_load(true); 上下翻转

使用 stbi_flip_vertically_on_write(true); 在写数据的时候翻转 (在stb_write_image中)

- 使用库

#include <...>
#define STB_IMAGE_IMPLEMENTATION    // include之前必须定义
#include "stb_image.h"

- 局限

  • no 12-bit-per-channel JPEG
  • no JPEGs with arithmetic coding
  • GIF always returns *comp=4

- 基础用法

int x,y,n;
unsigned char *data = stbi_load("filename",&x,&y,&n,0);
// filename : 文件名
// x : 图片宽
// y : 图片高
// n : 颜色通道个数
// 最后一个为自己设置的颜色通道个数,如果非0就按照此数值读取图像
// 返回值非NULL说明导入成功
// Do Something
stbi_image_free(data);

颜色通道

  • 1: 灰度图
  • 2: 灰度Alpha图
  • 3: 红绿蓝三色图
  • 4: 红绿蓝三色Alpha图

错误信息

const char* stbi_failure_reason()返回错误信息字符串

  • 定义 STBI_NO_FAILURE_STRINGS 避免编译这些字符串
  • 定义 STBI_FAILURE_USERMSG 使错误信息更加容易阅读

Unicode

Windows环境下可能需要满足Unicode的文件名

#define STBI_WINDOWS_UTF8可以使文件名满足Unicode

也可以使用stbiw_convert_wchar_to_utf8Windows wchar_t 转换为 utf8.

Addition

  • 预编译取消对某个格式的解析 :#define STBI_NO_PNG…
  • 预编译限制只能某个格式解析 :#define STBI_ONLY_PNG…

Else

获取x,y位置的像素信息,data为图像指针,n为颜色通道数

data[w*n*x+n*y+i] (i = 0,1,…,n-1)

作者还介绍了 SIMD支持, HDR图像支持, Iphone PNG支持

stb_image_write

- 使用库

#include <...>
#define STB_IMAGE_WRITE_IMPLEMENTATION  // include之前必须定义
#include "stb_image_write.h"

- 简单的使用

 int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality);int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);

- Else

作者还提到了PNG压缩,可提供自己的压缩函数,还有JPG质量的参数

代码示例

#include <iostream>
#include <stdlib.h>#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <stb_image_write.h>using namespace std;void setAlpha(int x, int y, int n, int w, int alpha, unsigned char *data) {data[w*n*x + y * n + n - 1] = alpha;
}int main()
{const char *filepath = "demo.png";int w, h, n;unsigned char *data = stbi_load(filepath, &w, &h, &n, 0);if (data == NULL) {cout << "ERROE_FILE_NOT_LOAD" << endl;return -1;}else {cout << w << " " << h << " " << n << endl;// 将上半身设置为透明for (int i = 0; i < h / 2; i++) {for (int j = 0; j < w; j++) {setAlpha(i, j, n, w, 0, data);}}// 写的时候翻转stbi_flip_vertically_on_write(true);stbi_write_png("out.png", w, h, n, data, 0);}stbi_image_free(data);return 0;
}
  • 原图像
  • 处理后

作者还有一个stb_image_resize.h支持对图像的简单放缩平移等操作

简单易用的C/C++ 图像库 stb_image stb_image_write相关推荐

  1. 简单易用的图像解码库介绍 —— stb_image

    原文链接:简单易用的图像解码库介绍 -- stb_image 说到图像解码库,最容易想起的就是 libpng 和 libjpeg 这两个老牌图像解码库了. libpng 和 libjpeg 分别各自对 ...

  2. BasicModal - 简单易用的现代 Web App 弹窗

    BasicModal 是为现代 Web 应用程序打造的弹窗系统.它包括所有你需要显示的信息,问题或接收用户的输入.这里的弹窗还可以链接起来,所以你可以很容易地建立一个预定义顺序的安装帮助或显示对话框. ...

  3. idea log 不输出error_还在使用console.log()吗?Bunyan:一个简单易用的JS日志框架

    Bunyan是一个简单易用的JS日志框架,可以工作在多种环境下,这里以Nodejs为例说明Bunyan的基本用法.是时候替换console.log的写法了. 安装 npm install --save ...

  4. 简单易用且功能丰富的纯Swift下载框架

    Tiercel    Tiercel是一个非常简单易用且功能丰富的纯Swift下载框架.最大的特点就是拥有强大的任务管理功能和可以直接获取常见的下载信息,并且只要加上一些简单的UI,就可以实现一个下载 ...

  5. 简单易用NLP框架Flair发布新版本!(附教程)

    机器之心编辑,参与:路. Flair 是 Zalando Research 开发的一款简单易用的 Python NLP 库,近日,Flair 0.4 版发布! Flair 具备以下特征: 强大的 NL ...

  6. SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流...

    SaltStack介绍和架构解析 简介 SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位.SaltSta ...

  7. 前端临床手扎——简单易用的fetch

    如题,es6 新增的fetch真的简单易用,感觉现在这一个支持完全可行. 虽然兼容性问题还是存在,但是打上polyfill后就基本解决了. Browser SupportChrome Firefox ...

  8. 让linux的防活墙也像windows一样简单易用

    既然是让linux也像windows一样简单易用   那就用最简单而有效的方法  不论在CLI还是GUI(只要不是绊脚本都简单)   用setup 打开linux下类似windows的提示框 以下对于 ...

  9. 简单绘图软件实现mfc大作业_生产流程图怎么做?简单易上手的流程图工具

    生产流程图是什么呢?首先,生产流程指的是在生产的过程中,劳动者通过利用一定的生产设备或工具,将各种原材料.半成品投入,按照一定顺序进行加工,最终得到成品产出的整个过程.而生产流程图则是使用图表符号的形 ...

  10. 一款基于RxJava2+Retrofit2实现简单易用的网络请求框架

    本库是一款基于RxJava2+Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置, ...

最新文章

  1. Ubuntu下安装Docker
  2. Net设计模式实例之备忘录模式(Memento Pattern)
  3. Java与汽车_Java NIO:IO与NIO的区别
  4. linux系统管理试卷必修B卷,2013-2014Linux系统管理试卷
  5. [洛谷3121]审查
  6. InfoQ观点:Java EE的未来
  7. BERT中CLS效果真的好嘛?这篇文章告诉你答案
  8. 实战爬虫:python爬虫学习笔记之爬取搜狗|微信文章——动态网页爬取
  9. Ubuntu 安装 tensorflow-gpu 1.4 包含 CUDA 8.0 和cuDNN
  10. java eclipse 下载_JAVA下载安装及eclipse下载安装
  11. SoapUI接口测试实战
  12. 智课雅思词汇---六、fer是什么意思
  13. R语言导入数据文件(数据导入、加载、读取)、使用read.table函数导入逗号分割文件CSV(Comma Delimited Text File)
  14. uni-app 加入logo.png
  15. Global Illumination_Spherical Harmonic Lighting(球谐光照)
  16. 比情商更能拉开人生差距的,是“闭环思维”
  17. 弈恩现实AVR星火计划,走进香港中文大学
  18. 通信工程师考试简介(直播回放)
  19. uni-app 字体文件引入,小程序不支持问题解决
  20. InfoPath + Workflow + MOSS

热门文章

  1. 地理必修一三大类岩石_高中地理必修一知识点总结材料完整版
  2. 【SQL SERVER 2005+版本行转列示例】(2012年1-8月水源槑党25强榜单新鲜出炉)
  3. 水桶理论——联想国际化的奇特哲学
  4. 基于PT2001 的4缸发动机 DFI 控制讲解3 - DCDC部分
  5. Excel VBA初级系列培训--课时2
  6. 物联网工程专业属于计算机类吗,物联网工程属于计算机类吗
  7. android 音乐播放器关于歌词的处理
  8. 按键截屏功能源码流程讲解
  9. exe文件关联修复器
  10. #SAP论坛•上海# 报名启动