Как мне взять данные из объекта FIBITMAP (изображения в произвольном изображении) и сохранить их в двоичном файле.
я уже знаю, как хранить данные в виде изображения, но вместо этого я бы хотел сохранить их как видео, похожее на Fraps. Моя цель — создать список изображений FIBITMAP и записать их в двоичный файл (формат .avi или .mp4).
это мой код скриншота:
BYTE* pixels = new BYTE[ 3 * width * height];
glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels);
// Convert to FreeImage format & save to file
FIBITMAP* image = FreeImage_ConvertFromRawBits(pixels, width, height, 3 * width, 24, 0x0000FF, 0xFF0000, 0x00FF00);
FreeImage_Save(FIF_PNG, image, "./images/test.avi");
// Free resources
FreeImage_Unload(image);
delete[] pixels;
Допустим, вы хотите сохранить его в avi. Это контейнерный формат, который определяет метаданные хранимого видеопотока (разрешение кадров, информацию о кодеке и т. Д.) И сам поток.
Есть много мест, где вы можете изучить его формат, а также RIFF в целом.
Другое дело, что если вы хотите воспроизвести видеофайл с помощью программного обеспечения «извне», вам необходимо предоставить кодек для системы, который программа-проигрыватель найдет в вашей ОС (вы как-то регистрируете кодек, это зависит от ОС). ), и кодек декодирует видеопоток, содержащийся в AVI, и передает кадры проигрывателю.
(На самом деле проигрыватель вызывает функцию декодирования с фрагментами потока, и ваш кодек должен взаимодействовать).
Конечно, в вашем видеопотоке каждый кадр является независимым и независимо кодируется от других. Но это не имеет значения с точки зрения OS-кодека. Ваш кодек имеет идентификатор (FOURCC), который должен быть установлен в разделе кодеков AVI, и проигрыватель будет искать кодек, используя этот идентификатор.
Может быть, на вашем месте я могу думать о движении JPEG. Это самая близкая существующая вещь по сравнению с тем, что вы делаете. Только в этом случае отдельные кадры не являются PNG, а JPEG.
Других решений пока нет …