您无法在 BMP 中存储 16 位灰度样本...请参阅维基百科.
BMP 中的每像素 16 位选项允许您存储 4 位红色、4 位绿色、4 位蓝色和 4 位 Alpha,但不能存储 16 位灰度。
24 位格式允许您存储 1 个字节的红色、1 个字节的绿色和 1 个字节的蓝色,但不能存储 16 位的灰度。
32 位 BMP 允许您存储 24 位 BMP 加 alpha。
您将需要使用PNG
, or a NetPBMPGM 格式,或TIFF
格式。PGM
格式很棒,因为CImg
可以在没有任何库的情况下编写,并且您可以随时使用图像魔术师将其转换为其他内容,例如:
convert image.pgm image.png
or
convert image.pgm image.jpg
这有效:
#define cimg_use_png
#define cimg_display 0
#include "CImg.h"
using namespace cimg_library;
using namespace std;
unsigned short buffer[1250][1250];
void fill_buffer()
{
unsigned short temp_data = 0;
for (int i =0;i < 1250; i++)
{
for (int j =0 ;j < 1250;j++)
{
buffer[i][j] = temp_data;
}
temp_data += 65535/1250;
}
}
int main()
{
fill_buffer();
auto hold_arr = (unsigned short*)&buffer[0][0];
cimg_library::CImg<unsigned short> img(hold_arr, 1250, 1250);
img.save_png("test.png");
return 0;
}
请注意,询问时CImg
要编写 PNG 文件,您需要使用这样的命令(使用libpng
and zlib
) 编译:
g++-7 -std=c++11 -O3 -march=native -Dcimg_display=0 -Dcimg_use_png -L /usr/local/lib -lm -lpthread -lpng -lz -o "main" "main.cpp"
仅作为解释:
-
-std=c++11
只是设定了C++标准
-
-O3 -march=native
只是为了加快速度,并不是严格要求的
-
-Dcimg_display=0
意味着所有 X11 标头都不会被解析,因此编译速度更快 - 但这意味着您无法显示程序中的图像,因此这意味着您“无头”
-
-Dcimg_use_png
意味着您可以使用以下方式读取/写入 PNG 图像libpng
而不是需要安装 ImageMagick
-
-lz -lpng
意味着生成的代码与 PNG 和 ZLIB 库链接。