Как написать круг в файл ppm с ++ - PullRequest
0 голосов
/ 24 мая 2018

Я хочу нарисовать круг и X в ppm-файле.Я использую следующий метод (описанный ниже), но я хочу знать, существует ли более быстрый или более эффективный метод, чем метод, который я использую.

Мой метод заключается в создании массива (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 голосов
/ 24 мая 2018

Я бы создал массив линейных указателей

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. Таким образом, вы можете избавиться от структуры и использовать DWORD или uint32_t вместо.Таким образом, вы можете установить все цветовые каналы одновременно, используя 0x00RRGGBB или 0x00BBGGRR формат пикселей.Вы можете даже использовать старшие 8 бит для альфа-канала.

Если вам все еще нужен доступ к R, G, B, вы можете использовать для этого объединение:

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

Единственная проблема заключается вчто если ваш ppm не знает 32bpp, то вам нужно преобразовать данные изображения в 24bpp перед сохранением в файл

...