首页 > 解决方案 > 如何通过c ++将圆圈写入ppm文件

问题描述

我想在 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++imagedrawinggeometryppm

解决方案


我会创建一个行指针数组

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 位。所以你可以摆脱结构并使用DWORDoruint32_t代替。这样,您可以使用0x00RRGGBB0x00BBGGRR像素格式一次设置所有颜色通道。您甚至可以将最高 8 位用于 Alpha 通道。

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

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

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


推荐阅读