【问题标题】:C++ How to create a large bitmap from a datalist stored in a deque?C++ 如何从存储在双端队列中的数据列表创建一个大位图?
【发布时间】:2013-07-11 01:54:55
【问题描述】:

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

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

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

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

我的像素值存储在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();
}

【问题讨论】:

  • 有点老,但几乎是同一个问题:stackoverflow.com/questions/199403/…
  • 谢谢!很高兴知道 2008 年你在那里,现在你可能是一个更好的程序员! :) 你试过 CImage 类吗?
  • 很抱歉让您失望了,但 2008 年我不在场,我也没有尝试过那门课。我只是怀疑可能有重复的问题并找到了上述内容。希望对您有所帮助。
  • deque 代替 vector 允许为 ex 创建更大的图像。 - 需要详细说明吗?只要您只喜欢您发布的示例中的push_backvector 永远是更好的选择。
  • 好吧 vector 需要一段空闲的内存,deque 存储在可用内存中的任何位置,这样可以提供更多内存

标签: c++ bitmap bmp deque


【解决方案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 数据格式稍微复杂一些。但是,即使不使用库,这两种格式都非常简单且易于编写。

【讨论】:

  • 太棒了!非常感谢,这正是我正在寻找的!
猜你喜欢
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多