Я хотел бы передать 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. К сожалению, вам придется сгенерировать его, проверить размер файла, а затем определить, нужно ли вам повторно генерировать.