Я пытаюсь сохранить изображение размером 5×5 пикселей, прочитанное с glReadPixels в файл, используя SOIL.
Я читаю пиксели:
int x = 400;
int y = 300;
std::vector< unsigned char* > rgbdata(4*5*5);
glReadPixels(x, y, 5, 5,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]);
Затем я пытаюсь сохранить прочитанные данные с помощью функции сохранения изображения SOIL.
int save_result = SOIL_save_image
(
"image_patch.bmp",
SOIL_SAVE_TYPE_BMP,
5, 5, 4,
rgbdata[0]
);
Но при попытке сохранить изображение я получаю необработанное исключение.
Решение (Кристиан Рау)
int x = 400;
int y = 300;
std::vector< unsigned char > rgbdata(4*5*5);
glReadPixels(x-(5/2), y-(5/2), 5, 5,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]);
int save_result = SOIL_save_image
(
"image_patch.bmp",
SOIL_SAVE_TYPE_BMP,
5, 5, 4,
rgbdata.data()
);
Вы создаете вектор указателей на unsigned char (std::vector<unsigned char*>
, но то, что вы хотите, это просто вектор без знака (std::vector<unsigned char>
).
И в призыве к SOIL_save_image
ты не должен давать это rgbdata[0]
, который будет представлять собой один беззнаковый символ (и с вашим неверным типом вектора неинициализированный указатель, что может привести к некоторой ошибке доступа к памяти), но указатель на полные данные и, таким образом, rgbdata.data()
(или же &rgbdata[0]
если у вас нет C ++ 11).
Также обратите внимание:
GL-х изображение упаковки / распаковки по умолчанию ширина должно быть кратно 4, то есть width
в glReadPixels(x, y, width, height, format, type, data)
должен соответствовать условию width % 4 == 0
,
Если width % 4 != 0
(в твоем случае 5 % 4 != 0
), Это может привести к неожиданным результатам. Таким образом, вы также должны избегать этих проблем, и вот решение:
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glPixelStorei(GL_PACK_ALIGNMENT,1);