在嵌入式图像处理中,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也蛮多星的,它还提供其他的头文件,由于其他领域。