C ++如何创建从存储在一个deque一个DataList一个大的位图?(C++ How to cr

2019-10-31 01:10发布

我在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头(便携位图)

其实,我想复制我的价值观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();
}

Answer 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文件正常工作与瘸子。

写入BMP或TGA文件的工作原理基本上是相同的 - 你先写一个标题,然后是实际数据。 主要的区别是,那些文件格式是二进制文件,所以文件I / O看起来有点不同,标题和图像数据的格式有稍微复杂一些。 但尽管如此,这两种格式都相当简单易写,即使不使用图书馆。



文章来源: C++ How to create a large bitmap from a datalist stored in a deque?