C ++如何从存储在双端队列中的数据列表创建大型位图?

时间:2013-07-11 01:54:55

标签: c++ bitmap bmp deque

我正在一遍又一遍地用C ++构建我的第一个程序。

该程序旨在创建一个图片,渐变 - 参数高度为h,宽度为l(以像素为单位),以及4个密度参数{{1 }}。 这个梯度由'1位'像素产生:它们是黑色或白色 - 并且通过最简单的误差扩散算法(有时也称为“天真”),

Da, Db, Dc, Dd

执行优化后(>> push the error on the next pixel of the line.而不是deque允许为ex创建更大的图片),我遇到了一个我现在无法解决的问题:

我的像素值存储在vector中,如何将它们传输到位图文件中?

我试图了解deque库但我找不到解决方案。

在我的代码中,您可以看到我尝试(失败)的EasyBMP来制作.PBM标头(便携式位图)

实际上,我想复制line 33的值(第30行) 到deque <int> dequeA;文件或任何其他光栅文件格式,而不是在.BMP文件中,如第72行所示!

这是我的代码,以及它的成果:

.txt

simplest error-diffusion with 4 corner-located density parameters

1 个答案:

答案 0 :(得分:1)

PBM文件非常易于创建,应该足以满足您的需要。无需使用外部库。

原始代码中的一个问题是您将PBM元数据和实际图像数据存储在同一dequeA中。不要那样做。混合这样的数据会使您的程序难以理解和维护。

您可以通过稍微调整编写文件的代码来创建有效的PBM文件:

ofstream output_file("./test.ppm");

// write file header
output_file << "P1\n" << (l+1) << " " << (h+1) << "\n";
//write image data
ostream_iterator<int> output_iterator(output_file, "\n");
copy(dequeA.begin(), dequeA.end(), output_iterator);

生成的PPM文件可以正常使用Gimp。

写入BMP或TGA文件的工作方式基本相同 - 首先编写标题,然后写入实际数据。主要区别在于这些文件格式是二进制文件,因此文件I / O看起来有点不同,标题和图像数据格式稍微复杂一些。但是,即使不使用库,这两种格式都非常简单易读。