PHP GD Jpeg с целевым размером файла

Я хотел бы передать PHP / GD ресурс изображения и размер целевого файла и вывести файл JPEG этого целевого размера. Скажем, у меня есть PNG-изображение размером 500 КБ, которое должно быть 100 КБ.

Пример.

function target_image_filesize($im,$target_size){ //create gd image //return a new image resource of specified size } 

Я знаю, что видел функцию для этого плавания вокруг, и это не то, что я ищу, чтобы изобретать, если это возможно.

Трюк будет заключаться в определении правильного качества JPEG. Но этот параметр никогда не определяется, здесь вы можете прочитать:

На самом деле, шкалы качества даже не стандартизированы в программах JPEG.

Но … может быть умное решение! Однако немного работы:

1) взять несколько изображений PNG
2) конвертировать их в JPEG с качеством, варьирующимся от (скажем) от 50 до 100 на шаг 1
3) проанализировать зависимость между качеством и размером файла – это квадратично: size ~ q * q или экспоненциальный size ~ x^q или обратный size ~ 1/q или что-то еще …?
4) создать общее выражение для прогнозирования размера файла с качеством и наоборот
5) опубликуйте результат здесь 🙂

Если у кого-то еще есть такая же проблема, это должно помочь.

 function make_jpeg_target_size($file,$saveDir,$targetKB){ $imageInfo = getimagesize($file); $filename = array_shift(explode('.',basename($file))); switch($imageInfo['mime']){ case 'image/jpeg': $src = imagecreatefromjpeg($file); break; case 'image/gif': $src = imagecreatefromgif($file); break; case 'image/png': $src = imagecreatefrompng($file); break; } $target = $targetKB*1024; $start_q = 1; $cur_q = 99; while($cur_q > $start_q){ $temp_file = tempnam(sys_get_temp_dir(), 'checksizer'); $out = imagejpeg($src, $temp_file, $cur_q); $size = filesize($temp_file); if($size <= $target){ $s = $targetKB.'kb'; $saveAs = str_replace("//","/",$saveDir.'/'.$filename.'-'.$s.'.jpg'); copy($temp_file, $saveAs); unlink($temp_file); $cur_q=0; } $cur_q=$cur_q-1; } if($saveAs == ''){ return false; }else{ return $saveAs; } } 

Если у вас есть доступ к командной строке, я рекомендую использовать http://www.imagemagick.org очень быстро. Мы используем его в нашем аналогичном приложении. в php – системе ('convert …'); или php lib http://php.net/manual/en/book.imagick.php

GD довольно медленный, и у нас были проблемы с ним

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