手绘图像并将其保存为数组?

时间:2017-05-17 10:36:51

标签: c# arrays image

问题:我应该使用哪种程序/文件格式?

我想创建一个图像(逐个像素地手绘)并将其导出为格式文件,形成为整数的伪数组,如下所示:

16  8

0   0   0   0   0   0   0   0   1   1   1   1   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   2   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   3   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   4   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   9   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   10  0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   11  0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   12  0   0   256 0

我希望每个数字代表独特的颜色(实际上只要绘图程序(更简单,更好 - MS Paint会做什么),实际上不管是什么颜色)本身可以读取它并且我可以区分它来自其他人)。最终,我希望能够使用外部程序快速绘制图像,并在我的代码中使用这些导出的数据。有人能指出我正确的方向吗?

我尝试使用GIMP将图片导出到 .c ,但结果是:

/* GIMP RGB C-Source image dump (Bez nazwy.c) */

static const struct {
  guint      width;
  guint      height;
  guint      bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ 
  guint8     pixel_data[64 * 64 * 2 + 1];
} gimp_image = {
  64, 64, 2,
  "\377\377\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"...

尽管接近这一点,但并不完全符合我的预期。

在这里,我看到了其他可能的解决方案:简单地绘制bmp图像并尝试将其转换为实际代码中的整数数组( C#)。但我想避免这种情况,除非有一些简单快捷的方法/方便的库来做到这一点。

或许你们中的一些人知道任何可以使用.bmp并返回一组int的在线转换器?

1 个答案:

答案 0 :(得分:0)

#include "ui_mainwindow.h"
#include <QString>

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

void generate(Ui::MainWindow* ui)
{
    if (ui->pic_label->pixmap() != 0)
    {
        int cap = 1024 * 4;
        int ct = 32;    //color tolerance
        //int number_of_colors_third = 256 / color_tolerance;//=256/32=8
        int *uncompressedcolortable = new int[256*256*256];
        for (int k=0; k<256; k++){
            for (int j=0; j<256; j++){
                for (int i=0; i< 256; i++){
                    uncompressedcolortable[k*256*256+j*256+i] = k*1000000+j*1000+i;
                }
            }
        }
        int width = ui->pic_label->pixmap()->width();
        int height = ui->pic_label->pixmap()->height();
//        int tiles = width * height;

        if ( (width > cap || height > cap) && !(ui->actionSurpass_sanity_check->isChecked())){
            ui->label->setText("File is too big to generate map. Check menu option if you want to process it anyway.");
            return;
        }

        QImage image = ui->pic_label->pixmap()->toImage();
        ui->lcdRED->setPalette(Qt::red);
        ui->lcdGREEN->setPalette(Qt::green);
        ui->lcdBLUE->setPalette(Qt::blue);
        ui->progressBar->setMaximum(height);
        QColor pixel_color;
        ofstream outfile ("C:/Users/Niewzruszony/Desktop/map.map");
        outfile << width << " " << height << std::endl;

        for (int j = 0; j < height; j++ )
        {
            outfile << std::endl;
            for (int i = 0; i < width; i++)
            {
                pixel_color = image.pixelColor(i,j);
                outfile << uncompressedcolortable[pixel_color.red()*256*256 + pixel_color.green()*256 + pixel_color.blue()];
                if(i != width-1) outfile << "\t";
                ui->lcdRED->display(QString::fromStdString(to_string( pixel_color.red())));
                ui->lcdGREEN->display(QString::fromStdString(to_string( pixel_color.green())));
                ui->lcdBLUE->display(QString::fromStdString(to_string( pixel_color.blue())));
            }
            ui->progressBar->setValue(j+1);
        }

        ui->lcdRED->setPalette(Qt::lightGray);
        ui->lcdGREEN->setPalette(Qt::lightGray);
        ui->lcdBLUE->setPalette(Qt::lightGray);
        ui->lcdRED->display(QString::fromStdString("0"));
        ui->lcdGREEN->display(QString::fromStdString("0"));
        ui->lcdBLUE->display(QString::fromStdString("0"));

        ui->label->setText("Generated RGB map.");
        return;
    }
    ui->pic_label->setText("First please choose image to process!");

}

完成它Qt。只是,我将分享代码。 注意我在发布时做了一些快速清理,不包括不重要的东西(至少不是全部)。