Сохранение части экрана в файл (SOIL и glReadPixels)

Я пытаюсь сохранить изображение размером 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()
);

4

Решение

Вы создаете вектор указателей на unsigned char (std::vector<unsigned char*>, но то, что вы хотите, это просто вектор без знака (std::vector<unsigned char>).

И в призыве к SOIL_save_image ты не должен давать это rgbdata[0], который будет представлять собой один беззнаковый символ (и с вашим неверным типом вектора неинициализированный указатель, что может привести к некоторой ошибке доступа к памяти), но указатель на полные данные и, таким образом, rgbdata.data() (или же &rgbdata[0] если у вас нет C ++ 11).

5

Другие решения

Также обратите внимание:

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

По вопросам рекламы [email protected]