0%

stb库的使用

在嵌入式图像处理中,c++读写图像往往不是那么方便,当然自己写一个图像处理的函数包含常用的几种图片格式是可以的,但是有时候行动伴随着明确的方向和目的,不可能什么都重写。

stb库

借助stb库可以方便的存取图像,(图像处理部分)它没有额外依赖,纯c编写, 可以直接加入项目的测试工程中,有这些就足够在测试和demo场景中使用了。

官方地址https://github.com/nothings/stb

stb库的使用

stb功能函数的实现全部都在对应功能的头文件中。

stb_image.h:从内存/本地载入图像,支持JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC
stb_image_write.h:向本地写图像文件PNG, TGA, BMP

还有很多其他的函数头文件,每个头文件的开头都有非常详细的说明,很容易就能知道你使用它需要做那些准备
基本上,使用每个头文件都需要定义适当的宏

stb存取图片的一个例子

包含stb_image.h stb_image_write.h方式如下

1
2
3
4
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

一个测试函数如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void stdReadWriteImage()
{
string filePath = "test.bmp";
int x, y, channels_in_file, desired_channels = 3;
unsigned char *data = stbi_load(filePath.c_str(), &x, &y, &channels_in_file, desired_channels);
if (!data)
{
fprintf(stderr, "fail to read image: %s\n", filePath.c_str());
return;
}
fprintf(stdout, "image: %s, x: %d, y: %d, channels_in_file: %d, desired_channels: %d\n",
filePath.c_str(), x, y, channels_in_file, desired_channels);

printf("1\n");

string storeFilePath = "/mnt/bjwang/stbTest.bmp";
int width_resize = x;
int height_resize = y;
unsigned char *outputPixel = data;
int ret = stbi_write_png(storeFilePath.c_str(), width_resize, height_resize, desired_channels, outputPixel, 0);
if (ret == 0)
{
fprintf(stderr, "fail to write image png: %s\n", storeFilePath.c_str());
return ;
}
printf("2\n");

free(data);
return;
}

说明

stb库非常好用,github也蛮多星的,它还提供其他的头文件,由于其他领域。