我一遍又一遍地用 C++ 构建我的第一个程序。
该程序旨在创建一张图片,渐变 - 参数为高度 h
, 宽度 l
,以像素为单位,以及 4 个密度参数 Da, Db, Dc, Dd
.
该梯度由“1 位”像素产生:它们是黑色或白色 - 以及最简单的误差扩散算法(有时称为“朴素”算法),
>> push the error on the next pixel of the line.
执行优化后(deque
而不是 vector
允许为示例创建更大的图像),我遇到了一个我现在无法解决的问题:
我的像素值存储在 deque
中, 如何将它们传输到位图文件中?
我试图理解 EasyBMP
库,但我找不到解决方案。
在我的代码中,你可以看到line 33
我尝试(未成功)制作 .PBM header (可移植位图)
实际上,我想复制我的 deque <int> dequeA;
的值(第 30 行)
到 .BMP
文件或任何其他光栅文件格式,而不是 .txt
文件就像它发生在第 72 行一样!
这是我的代码,以及它的效果图:
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <iterator>
#include <cstdlib>
#include <string>
#include <sstream>
using namespace std;
// constant values
double Da=1; //densities
double Db=0.5;
double Dc=0.5;
double Dd=0;
double l = 999; //width & height => L = l+1 /// 999 = 1000 pixels
double h = 999;
//double u = 1; // UNIT
double D = 0; // GAMMA
double E = 0; // ERROR LOCAL
vector <double> F; // ERROR DYNAMIC
int main ()
{
// vector
deque <int> dequeA;
F.push_back (0);
//dequeA.push_back (2); //FAKE PBM header (old)
//dequeA.push_back (l+1);
//dequeA.push_back (h+1);
//dequeA.push_back (1);
float a = 0;
float b = 0; // Local variables
double IO = 0; // variable I/O
while (a<l+1, b<h+1){
//values for given a & b
double DL = Da-Da*(b/h)+Dc*(b/h);
double DR = Db-Db*(b/h)+Dd*(b/h);
double D = DL-DL*(a/l)+DR*(a/l); //GAMMA
if (E+0-D<=-0.5) {
dequeA.push_back(1);
IO = 1;
}
else {
dequeA.push_back(0);
IO = 0;
}
E = E+IO-D;
F.push_back(E);
// next pixel & next line
a++;
if (a>l) {
a = 0;
b = b++;
E = 0;
F.clear();
}
}
//export values to .txt file
ofstream output_file("./test.txt");
ostream_iterator<int> output_iterator(output_file, "\n");
copy(dequeA.begin(), dequeA.end(), output_iterator);
dequeA.clear();
}
最佳答案
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 看起来有点不同,而且文件头和图像数据格式稍微复杂一些。但是,即使不使用库,这两种格式都非常简单且易于编写。
关于C++ 如何从存储在双端队列中的数据列表创建大位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583825/