如何通过C ++将圆圈写入PPM文件

how to write circle to ppm file by c++

本文关键字:PPM 文件 何通过      更新时间:2023-10-16

我想在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);

我会创建一个行指针数组

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 RGB
{
uint8_t db[4];
uint32_t dd;
};

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