代码之家  ›  专栏  ›  技术社区  ›  Adam

C++生成图像

  •  8
  • Adam  · 技术社区  · 15 年前

    我已经有一段时间没有用C++编程了,现在我必须写一个简单的东西,但它让我发疯。

    我需要从颜色表创建位图: char image[200][200][3];

    第一个坐标是宽度,第二个高度,第三个颜色:RGB。如何做到这一点?

    谢谢你的帮助。 亚当

    5 回复  |  直到 15 年前
        1
  •  13
  •   Ron Warholic    15 年前

    我相信你已经检查过了 http://en.wikipedia.org/wiki/BMP_file_format .

    有了这些信息,我们可以编写一个快速的BMP:

    // setup header structs bmpfile_header and bmp_dib_v3_header before this (see wiki)
    // * note for a windows bitmap you want a negative height if you're starting from the top *
    // * otherwise the image data is expected to go from bottom to top *
    
    FILE * fp = fopen ("file.bmp", "wb");
    fwrite(bmpfile_header, sizeof(bmpfile_header), 1, fp);
    fwrite(bmp_dib_v3_header, sizeof(bmp_dib_v3_header_t), 1, fp);
    
    for (int i = 0; i < 200; i++)  {
     for (int j = 0; j < 200; j++) {
      fwrite(&image[j][i][2], 1, 1, fp);
      fwrite(&image[j][i][1], 1, 1, fp);
      fwrite(&image[j][i][0], 1, 1, fp);
     }
    }
    
    fclose(fp);
    

    如果设置邮件头有问题,请通知我们。

    编辑:我忘了,BMP文件需要的是BGR而不是RGB,我已经更新了代码(没人发现它很奇怪)。

        2
  •  3
  •   dagoof    15 年前

    我建议 ImageMagick 综合图书馆等。

        3
  •  0
  •   Igor    15 年前

    我会首先尝试找出 BMP file format (这就是位图的含义,对吧?)定义。然后我将把数组转换成那个格式并将其打印到文件中。

    如果这是一个选项,我也会考虑寻找一个现有的库来创建BMP文件,并使用它。

    对不起,如果我说的话对你来说已经很明显了,但是我不知道你在这个过程的哪个阶段被卡住了。

        4
  •  0
  •   Goz    15 年前

    建议将函数初始化为简单的一维数组。

    ie(其中bytes是每个像素的字节数)

     char image[width * height * bytes];
    

    然后您可以访问数组中的相关位置,如下所示

     char byte1 = image[(x * 3) + (y * (width * bytes)) + 0];
     char byte2 = image[(x * 3) + (y * (width * bytes)) + 1];
     char byte3 = image[(x * 3) + (y * (width * bytes)) + 2];
    
        5
  •  0
  •   Jaime Ivan Cervantes    10 年前

    对于简单的图像操作,我强烈推荐 Cimg . 这个图书馆的工作很有魅力,非常容易使用。您只需要在代码中包含一个头文件。实际上,我花了不到10分钟的时间来编译和测试。

    不过,如果你想做更复杂的图像操作,我会同意 Magick++ 按照达格夫的建议。