Из предыдущих вопросов 1 а также 2, У меня есть следующие коды:
Как сделать снимок экрана:
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
std::vector< unsigned char > rgbdata(4*width*height);
glReadPixels(0, 0, width, height,GL_RGBA,GL_UNSIGNED_BYTE, &rgbdata[0]);
int save_result = SOIL_save_image
(
filename,
SOIL_SAVE_TYPE_PNG,
width, height, 4,
rgbdata.data()
);
и как хранить в PNG:
#define png_infopp_NULL (png_infopp)NULL
#define int_p_NULL (int*)NULL
#include <boost/gil/gil_all.hpp>
#include <boost/gil/extension/io/png_dynamic_io.hpp>
using namespace boost::gil;
int main()
{
rgb8_image_t img(512, 512);
rgb8_pixel_t red(255, 0, 0);
fill_pixels(view(img), red);
png_write_view("redsquare.png", const_view(img));
}
Я хочу сохранить захваченный экран в png
файл.
Теперь вопрос в том, как связать эти коды друг с другом? Являются ли эти массивы конвертируемыми друг в друга?
Кто знает?
Лучше всего передавать изображения в виде необработанных указателей, выделенных с помощью C malloc, в основном потому, что люди создают псевдонимы для того, что по сути того же типа данных, и это приводит шаблоны в беспорядок.
Выберите rgb или rgba в качестве внутреннего формата. Затем напишите клейкий код для преобразования в формат, который хочет третья сторона библиотеки. В этом случае Boost принимает rgb8_image_t, который создает сам Boost. Вы не хотите, чтобы этот символ загрязнял ваше пространство имен где-либо еще, за исключением того момента, когда вы полагаетесь на bool gil для сохранения изображения. Так что напишите обертку и затем возитесь с Boost, пока формат не придет в норму.
Если вы используете процедуры сохранения файла Baby X, эти проблемы просто исчезнут.
Подпрограммы принимают беззнаковые буферы символов и не пытаются экспортировать типы данных для изображений.
https://github.com/MalcolmMcLean/babyxrc
(lodePNG не мое, он был написан Лоде Вандевенне, поэтому, пожалуйста, соблюдайте лицензионные требования. Вы можете делать то, что вы хотите с другими форматами, так как они были созданы мной).
Других решений пока нет …