如何通过c ++

时间:2018-05-24 11:14:51

标签: c++ image drawing geometry ppm

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

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

数组是

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);

1 个答案:

答案 0 :(得分:0)

我会创建一个行指针数组

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