【问题标题】:how to write circle to ppm file by c++如何通过c ++将圆圈写入ppm文件
【发布时间】:2018-05-24 11:14:51
【问题描述】:

我想在 ppm 文件中画一个圆圈和 X。 我使用以下方法(如下所述),但我想知道是否有比我使用的方法更快或更有效的方法。

我的方法是创建一个包含在每个 RGB 结构单元中的 (n X m) 大小的数组

数组是

RGB image[dimx*dimy];

结构是

struct RGB {
      uint8_t red, green, blue;
 public:
      RGB() {}
      RGB(uint8_t red, uint8_t green, uint8_t blue): red(red), green(green), blue(blue) {}
};

我在正确的地方写下适当的值来得到一个圆圈

image[x].red = 0;
image[x].green = 0;
image[x].blue = 0;

最后,我通过

将数组写入一个ppm文件
imageFile.write(reinterpret_cast<char*>(&image), 3*dimx*dimy);

【问题讨论】:

    标签: c++ image drawing geometry ppm


    【解决方案1】:

    我会创建一个行指针数组

    RGB *pyx[dimy];
    for (int y=0;y<dimy;y++) pyx[y]=image+(y*dimx);
    

    所以现在您可以 R/W 访问任何像素(x,y),例如:

    pyx[y][x]=...;
    ...=pyx[y][x];
    

    无需重新计算地址,这比在每个像素访问上相乘要快得多...

    另一件事是每像素使用 32 位而不是 24 位。因此您可以摆脱结构并改用 DWORDuint32_t。这样您就可以使用0x00RRGGBB0x00BBGGRR 像素格式一次设置所有颜色通道。您甚至可以将最高 8 位用于 Alpha 通道。

    如果您仍然需要访问 R、G、B,您可以使用 union:

    union RGB
        {
        uint8_t db[4];
        uint32_t dd;
        };
    

    唯一的问题是,如果您的 ppm 不知道 32bpp,那么您需要在保存到文件之前将图像数据转换为 24bpp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2015-05-07
      • 1970-01-01
      • 2017-07-30
      • 2010-12-31
      相关资源
      最近更新 更多