PHP GD Jpeg с целевым размером файла - PullRequest
2 голосов
/ 10 августа 2011

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

Пример.

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

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

Ответы [ 4 ]

2 голосов
/ 11 августа 2011

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

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;
    }
}
2 голосов
/ 10 августа 2011

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

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

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

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

0 голосов
/ 10 августа 2011

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

0 голосов
/ 10 августа 2011

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

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

...