0

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

该程序旨在创建一个图片,一个渐变- 具有高度h、宽度l、像素参数和 4 个密度参数Da, Db, Dc, Dd。这种梯度是由“1 位”像素产生的:它们是黑色或白色的 - 并且是通过最简单的误差扩散算法(有时称为“幼稚”)产生的,

>> push the error on the next pixel of the line.

在执行了优化之后(deque而不是vector允许为 ex. 创建更大的图像),我遇到了一个我现在无法解决的问题:

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

我试图了解EasyBMP图书馆,但我找不到解决方案。

在我的代码中,您可以看到line 33我尝试(未成功)制作 .PBM 标头(便携式位图)

实际上,我想将我的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();
}

具有 4 个角点密度参数的最简单误差扩散

4

1 回答 1

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 看起来有点不同,而且 header 和 image 数据格式稍微复杂一些。但是,即使不使用库,这两种格式都非常简单且易于编写。

于 2013-07-11T08:36:49.553 回答