零基础C/C++学习路线推荐,还有stb_image图像加载库介绍
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 面向对象
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 设计模式
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ STL
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 技术杂谈
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 常用函数
前面介绍了 svpng 函数,用于将 RGB / RGBA 图像保存为 PNG。今天在介绍另外一个 ;
一. 简介
.h 是 Sean 的一个非常流行的单头文件图像加载库,它能够读写大部分流行的文件格式,支持文件格式如下:
二. 配置到工程中使用
.h 代码在文章末尾,可以直接复制粘贴使用,当然也可以在 下载。
.h 加入你的工程,并另创建一个新的 C++ 文件,输入以下代码:
#define STB_IMAGE_IMPLEMENTATION //必须加上
#include "stb_image.h"
通过定义 TION,预处理器会修改头文件,让其只包含相关的函数定义源码,等于是将这个头文件变为一个 .cpp 文件了,现在只需要在你的程序中包含 .h 之后输入你的代码并编译就可以了。
三. 读取
要使用 .h 加载图片,我们需要使用它的 函数:
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C/C++ 使用 stb_image 加载 png / jpg / gif / bmp等常用图片
//@Time:2022/03/28 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
/*
* 描述:载入图像,支持的图像文件格式包括JPEG、PNG、TGA、BMP、PSD、GIF、HDR、PIC、PNM
*
* 参数:
* filename:图像文件名
* x:获取图像宽
* y:获取图像高
* channels_in_file:获取图像通道数
* desired_channels:指定期望的通道数,若为0则不做颜色空间变换
*
* 返回值:加载图像成功返回图像数据指针,否则返回NULL;
*/
unsigned char *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
四. 写入

可以分别支持生产 png 和 jpg,函数声明如下
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C/C++ 使用 stb_image 加载 png / jpg / gif / bmp等常用图片
//@Time:2022/03/28 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#define STB_IMAGE_WRITE_IMPLEMENTATION
#define STB_IMAGE_WRITE_STATIC
#include "stb_image_write.h"
/*
* 描述:保存图像,支持的图像文件格式包括PNG、BMP、TGA、JPG、HDR
*
* 参数:
* filename:保存图像名
* x:图像宽
* y:图像高
* comp:图像通道数
* data:指定期望的通道数,若为0则不做颜色空间变换
* quality:图像质量(quality,取值范围1~100,仅限jpg)
*
* 返回值:成功返回非0值,否则返回0。
*/
int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality)
/*
* 描述:保存图像,支持的图像文件格式包括PNG、BMP、TGA、JPG、HDR
*
* 参数:
* filename:保存图像名
* x:图像宽
* y:图像高
* comp:图像通道数
* data:指定期望的通道数,若为0则不做颜色空间变换
* stride_bytes:步长,若为0则为宽*通道数,仅限png
*
* 返回值:成功返回非0值,否则返回0。
*/
int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes)
五. 缩放
缩放函数如下:
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C/C++ 使用 stb_image 加载 png / jpg / gif / bmp等常用图片
//@Time:2022/03/28 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#define STB_IMAGE_RESIZE_STATIC
#include "stb_image_resize.h"
/*
* 描述:图像缩放
*
* 参数:
* input_pixels:输入图像数据指针
* input_w:输入图像宽
* input_h:输入图像高
* input_stride_in_bytes:输入图像步长,若为0则为宽x通道数
* output_pixels:输出图像数据指针
* output_w:输出图像宽
* output_h:输出图像高
* output_stride_in_bytes:输出图像步长,若为0则为宽x通道数
* num_channels:图像通道数,输入与输出一致
*
* 返回值:成功返回1,否则返回0;
*/
int stbir_resize(const void *input_pixels , int input_w , int input_h , int input_stride_in_bytes,void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,stbir_datatype datatype,int num_channels, int alpha_channel, int flags,stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,stbir_filter filter_horizontal, stbir_filter filter_vertical,stbir_colorspace space, void *alloc_context);
六. 内存释放
释放内存如下:
void stbi_image_free (void *retval_from_stbi_load);
七. 使用案例
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C/C++ 使用 stb_image 加载 png / jpg / gif / bmp等常用图片
//@Time:2022/03/28 07:30
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#include
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "stb_image_resize.h"
#include
#include
#include
#include
using namespace std;
int main() {
std::cout << "Hello, STB_Image" << std::endl;
string inputPath = "d://input.png";
int iw, ih, n;
// 加载图片获取宽、高、颜色通道信息
unsigned char *idata = stbi_load(inputPath.c_str(), &iw, &ih, &n, 0);
int ow = iw / 2;
int oh = ih / 2;
auto *odata = (unsigned char *) malloc(ow * oh * n);
// 改变图片尺寸
stbir_resize(idata, iw, ih, 0, odata, ow, oh, 0, STBIR_TYPE_UINT8, n, STBIR_ALPHA_CHANNEL_NONE, 0,
STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP,
STBIR_FILTER_BOX, STBIR_FILTER_BOX,
STBIR_COLORSPACE_SRGB, nullptr
);
string outputPath = "d://output.png";
// 写入图片
stbi_write_png(outputPath.c_str(), ow, oh, n, odata, 0);
stbi_image_free(idata);
stbi_image_free(odata);
return 0;
}
八. 完整代码下载
源码下载地址:https://github.com/nothings/stb
九.猜你喜欢C语言 数组下标越界和内存溢出区别C语言 使用指针遍历数组C语言 指针和数组区别C语言 指针数组和数组指针区别C语言 野指针C语言 函数值传递和址传递函数不定长参数C语言 函数指针C语言 指针函数C语言 回调函数 语言 # onceC语言 # 与 # “” 区别C语言 const 修饰函数参数C语言 const 和 区别C语言 / / 自定义 函数C语言 main 函数参数 main(int argc, char *argv)C语言 结构体简介(一)C语言 结构体定义和使用(二)C语言 结构体数组(三)C语言 结构体指针(四)C语言 结构体成员函数(五)C语言 结构体嵌套(六)C语言 结构体值传递和址传递(七)C/C++ error: to non- data const ‘xxxx’C++ 关于类中 const 的使用C/C++ =/C++ 条件编译 #/C++ error C2065: “M_PI”: 未声明的标识符C/C++ error C2027: 使用了未定义类型“std::tuple”C/C++ vs 没有匹配 if 的非法 else 问题解决办法C/C++ 中文注释导致编译不能通过C/C++ error C2589: “(”: “::”右边的非法标记C/C++ error:表达式是必须修改的左值C/C++ error C4996: ‘getch’: The POSIX name for this item is . , use the ISO C++ confC/C++ error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型C/C++ std:: 字符串分割C/C++ std:: 使用介绍 中 工具使用C/C++ error :”XXX已经在 XXX.obj 中定义C/C++ 判断字符串是否为 utf-8 编码C/C++ svpng 将 RGBA 保存 png 图片C/C++ 使用 加载 png / jpg / gif / bmp等常用图片
3.5 国内中文镜像站免费使用啦
























