Масштабировать изображение в соответствии с максимальным размером файла

Я использую Imagick и люблю масштабировать изображение до максимального размера файла 2,5 МБ

Я посмотрел на этот вопрос SOF: ImageMagick: масштабировать изображение в формате JPEG с максимальным размером файла, что и есть то, что я хочу сделать, но метод extent() из Imagick не имеет параметра размера: http: //www.php .net / ручной / EN / imagick.extentimage.php

Кто-нибудь знает, как я мог? На данный момент я пытаюсь вычислить коэффициент между исходным размером файла и размером целевого файла для вычисления нового разрешения, но выяснил, что разрешение не пропорционально размеру файла.

Обновление – выходной формат всегда JPEG, поэтому, если есть способ рассчитать размер, прежде чем сохранить его, что было бы здорово

Спасибо заранее, Maxime

    Функция объема, которую вы вызываете, – это просто установить размер изображения.

    Функция установки параметра jpeg extent:

     $imagick->setOption('jpeg:extent', '2500kb'); 

    Интересно, что функция $ imagick-> getImageBlob (), кажется, падает после установки этой опции. Вы вынуждены записывать файл на диск, вместо того, чтобы напрямую получать его байты.

    Формат вывода всегда JPEG, поэтому, если есть способ рассчитать размер, прежде чем сохранить его, что было бы здорово

    Нет. Количество деталей, которое находится на каждом изображении, определяет размер изображения после сжатия для заданного качества изображения. Таким образом, невозможно рассчитать уровень качества, который даст конечный размер.

    Код C из базовой библиотеки Image Magick, которая ограничивает размер файла:

     maximum=101; for (minimum=2; minimum < maximum; ) { jpeg_image->quality=minimum+(maximum-minimum+1)/2; status=WriteJPEGImage(jpeg_info,jpeg_image); if (GetBlobSize(jpeg_image) <= extent) minimum=jpeg_image->quality+1; else maximum=jpeg_image->quality-1; } } 

    Т.е. он просто пересчитывает файл на разных уровнях качества изображения, пока не найдет уровень, который дает приемлемый размер файла для данного значения.