В зависимости от форматов изображений, которые вы хотите поддерживать, почти наверняка возможно выполнить инкрементальное декодирование и масштабирование, декодируя только несколько строк за раз и отбрасывая данные после записи в выходной файл. Однако для этого может потребоваться написание собственного кода или адаптация существующей библиотеки декодера.
Стоит также отметить, что сокращение гигантских jpeg-файлов может быть эффективно выполнено путем простого пропуска высокочастотных коэффициентов и использования меньшего IDCT. Например, чтобы декодировать с половинной шириной и половинной высотой, отбросьте все, кроме верхнего левого квадранта коэффициентов (горизонтальная и вертикальная частота <4), и используйте для них IDCT 4x4 вместо обычных 8x8. И декодер <code>libjpeg, и декодер libavcodec
поддерживают эту операцию для масштабирования степени 2 (1/2, 1/4 или 1/8). Этот тип подхода может сделать ненужным добавочное декодирование / масштабирование.
Вы можете попробовать это с djpeg -scale 1/4 < src.jpg | cjpeg > dest.jpg
. Если вам нужен фиксированный выходной размер, вы, вероятно, сначала масштабируете в зависимости от того, какой из 1/2, 1/4 или 1/8 приблизит вас к желаемому размеру, не переходя к низкому, а затем выполните интерполяцию, чтобы перейти к последнему шагу например djpeg -scale 1/4 < src.jpg | convert pnm:- -scale 640x480 dest.jpg
.