Вы можете использовать что-то вроде zlib, чтобы сжать его в памяти, а затем распаковать его только тогда, когда это необходимо; тем не менее, большинство современных компьютеров имеют достаточно много памяти, поэтому вы можете обрабатывать довольно много изображений, прежде чем начать сжатие. С видео, которые фактически являются МНОЖЕСТВОМ изображений, это становится немного более важным - вы склонны к распаковке по ходу работы и, возможно, даже к потоковому воспроизведению с диска.
Обычный способ справиться с этим, с точки зрения API, состоит в том, чтобы иметь что-то вроде объекта Image и объекта Video (классов). Эти объекты будут иметь функции для «получения» несжатого изображения / кадра. Функция «get» проверит, сжаты ли данные в данный момент; если это так, он распаковывает его перед возвратом; если он не сжат, он может вернуть его немедленно. То, как данные на самом деле хранятся (сжатые / несжатые / на диске / в памяти), и детали работы с ними, таким образом, скрыты за функцией «get». Самое главное, эта модель позволяет вам позже передумать, добавив дополнительные типы сжатия, добавив поддержку потоковой передачи на диск и т. Д., Не изменяя способ написания кода, вызывающего функцию get ().
Другая проблема заключается в том, как вы возвращаете объект Image или Video из функции. Вы можете сделать это так:
Image getImageFromURL( const std::string &url );
Но есть интересная проблема, что изображение «копируется» во время процесса возврата (иногда зависит от того, как компилятор оптимизирует вещи). Этот способ более эффективно использует память:
void getImageFromURL( const std::string &url, Image &result );
Таким образом, вы передаете объект изображения, в который хотите загрузить свое изображение. Копии не сделаны. Вы также можете изменить возвращаемое значение 'void' на какой-либо код ошибки / состояния, если вы не используете исключения.