Я бы создал массив линейных указателей
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 перед сохранением в файл