简单易用的C/C++ 图像库 stb_image stb_image_write
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_utf8
将Windows 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相关推荐
- 简单易用的图像解码库介绍 —— stb_image
原文链接:简单易用的图像解码库介绍 -- stb_image 说到图像解码库,最容易想起的就是 libpng 和 libjpeg 这两个老牌图像解码库了. libpng 和 libjpeg 分别各自对 ...
- BasicModal - 简单易用的现代 Web App 弹窗
BasicModal 是为现代 Web 应用程序打造的弹窗系统.它包括所有你需要显示的信息,问题或接收用户的输入.这里的弹窗还可以链接起来,所以你可以很容易地建立一个预定义顺序的安装帮助或显示对话框. ...
- idea log 不输出error_还在使用console.log()吗?Bunyan:一个简单易用的JS日志框架
Bunyan是一个简单易用的JS日志框架,可以工作在多种环境下,这里以Nodejs为例说明Bunyan的基本用法.是时候替换console.log的写法了. 安装 npm install --save ...
- 简单易用且功能丰富的纯Swift下载框架
Tiercel Tiercel是一个非常简单易用且功能丰富的纯Swift下载框架.最大的特点就是拥有强大的任务管理功能和可以直接获取常见的下载信息,并且只要加上一些简单的UI,就可以实现一个下载 ...
- 简单易用NLP框架Flair发布新版本!(附教程)
机器之心编辑,参与:路. Flair 是 Zalando Research 开发的一款简单易用的 Python NLP 库,近日,Flair 0.4 版发布! Flair 具备以下特征: 强大的 NL ...
- SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流...
SaltStack介绍和架构解析 简介 SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位.SaltSta ...
- 前端临床手扎——简单易用的fetch
如题,es6 新增的fetch真的简单易用,感觉现在这一个支持完全可行. 虽然兼容性问题还是存在,但是打上polyfill后就基本解决了. Browser SupportChrome Firefox ...
- 让linux的防活墙也像windows一样简单易用
既然是让linux也像windows一样简单易用 那就用最简单而有效的方法 不论在CLI还是GUI(只要不是绊脚本都简单) 用setup 打开linux下类似windows的提示框 以下对于 ...
- 简单绘图软件实现mfc大作业_生产流程图怎么做?简单易上手的流程图工具
生产流程图是什么呢?首先,生产流程指的是在生产的过程中,劳动者通过利用一定的生产设备或工具,将各种原材料.半成品投入,按照一定顺序进行加工,最终得到成品产出的整个过程.而生产流程图则是使用图表符号的形 ...
- 一款基于RxJava2+Retrofit2实现简单易用的网络请求框架
本库是一款基于RxJava2+Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置, ...
最新文章
- Ubuntu下安装Docker
- Net设计模式实例之备忘录模式(Memento Pattern)
- Java与汽车_Java NIO:IO与NIO的区别
- linux系统管理试卷必修B卷,2013-2014Linux系统管理试卷
- [洛谷3121]审查
- InfoQ观点:Java EE的未来
- BERT中CLS效果真的好嘛?这篇文章告诉你答案
- 实战爬虫:python爬虫学习笔记之爬取搜狗|微信文章——动态网页爬取
- Ubuntu 安装 tensorflow-gpu 1.4 包含 CUDA 8.0 和cuDNN
- java eclipse 下载_JAVA下载安装及eclipse下载安装
- SoapUI接口测试实战
- 智课雅思词汇---六、fer是什么意思
- R语言导入数据文件(数据导入、加载、读取)、使用read.table函数导入逗号分割文件CSV(Comma Delimited Text File)
- uni-app 加入logo.png
- Global Illumination_Spherical Harmonic Lighting(球谐光照)
- 比情商更能拉开人生差距的,是“闭环思维”
- 弈恩现实AVR星火计划,走进香港中文大学
- 通信工程师考试简介(直播回放)
- uni-app 字体文件引入,小程序不支持问题解决
- InfoPath + Workflow + MOSS