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

标签 c++ bitmap bmp deque

我一遍又一遍地用 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();
}

simplest error-diffusion with 4 corner-located density parameters

最佳答案

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/

相关文章:

c++ - SDL_RenderCopy() 在 Raspberry PI 上有奇怪的行为

android - setImageViewBitmap 在 android 小部件中不起作用

C++ GDI+ 选择调色板

java - 解码 .bmp 图像

通过优势警告进行 C++ 继承

c++ - If 语句返回错误的输出 C++

c++ - visual studio 2008 express 需要很长时间才能在 Debug模式下运行 c++ 应用程序(小)

android - 如何防止 GridView 图片在滚动时改变位置?

algorithm - IF图像中细胞膜的识别

c++ - 如何用GDI+绘制透明BMP