Проблема изменения размера изображения в PHP - gd создает ужасные изображения с измененным размером - PullRequest
7 голосов
/ 07 октября 2009

Я создаю миниатюры фиксированной высоты и ширины из моего PHP-скрипта, используя следующую функцию

/*creates thumbnail of required dimensions*/
function createThumbnailofSize($sourcefilepath,$destdir,$reqwidth,$reqheight,$aspectratio=false)
{
    /*
     * $sourcefilepath =  absolute source file path of jpeg
     * $destdir =  absolute path of destination directory of thumbnail ending with "/"
     */
    $thumbWidth = $reqwidth; /*pixels*/
    $filename = split("[/\\]",$sourcefilepath);
    $filename = $filename[count($filename)-1];
    $thumbnail_path = $destdir.$filename;
    $image_file = $sourcefilepath;

    $img = imagecreatefromjpeg($image_file);
    $width = imagesx( $img );
    $height = imagesy( $img );

    // calculate thumbnail size
    $new_width = $thumbWidth;
    if($aspectratio==true)
    {
        $new_height = floor( $height * ( $thumbWidth / $width ) );
    }
    else
    {
        $new_height = $reqheight;
    }

    // create a new temporary image
    $tmp_img = imagecreatetruecolor( $new_width, $new_height );

    // copy and resize old image into new image
    imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );

    // save thumbnail into a file

    $returnvalue = imagejpeg($tmp_img,$thumbnail_path);
    imagedestroy($img);
    return $returnvalue;
}

и я вызываю эту функцию со следующими параметрами

createThumbnailofSize($sourcefilepath,$destdir,48,48,false);

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

Ответы [ 5 ]

25 голосов
/ 07 октября 2009

Используйте imagecopyresampled() вместо imagecopyresized().

1 голос
/ 07 октября 2009

Вы также можете рассмотреть возможность использования ImageMagick (http://us3.php.net/manual/en/book.imagick.php) вместо Б-га. У меня была такая же проблема всего пару дней назад с Java. Переход на ImageMagick вместо Java Advanced Images привел к огромному разница в качестве.

1 голос
/ 07 октября 2009

если это качество изображения, то вам нужно указать параметр качества при сохранении изображения с помощью imagejpeg ($ tmp_img, $ thumbnail_path, 100) // значение по умолчанию 75

/*creates thumbnail of required dimensions*/
function 
createThumbnailofSize($sourcefilepath,$destdir,$reqwidth,$reqheight,$aspectratio=false)
{
    /*
     * $sourcefilepath =  absolute source file path of jpeg
     * $destdir =  absolute path of destination directory of thumbnail ending with "/"
     */
    $thumbWidth = $reqwidth; /*pixels*/
    $filename = split("[/\\]",$sourcefilepath);
    $filename = $filename[count($filename)-1];
    $thumbnail_path = $destdir.$filename;
    $image_file = $sourcefilepath;

$img = imagecreatefromjpeg($image_file);
$width = imagesx( $img );
$height = imagesy( $img );

// calculate thumbnail size
$new_width = $thumbWidth;
if($aspectratio==true)
{
    $new_height = floor( $height * ( $thumbWidth / $width ) );
}
else
{
    $new_height = $reqheight;
}

// create a new temporary image
$tmp_img = imagecreatetruecolor( $new_width, $new_height );

// copy and resize old image into new image
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );

// save thumbnail into a file

$returnvalue = imagejpeg($tmp_img,$thumbnail_path,100);
imagedestroy($img);
return $returnvalue;

}

0 голосов
/ 04 марта 2011

пробовал использовать php.Thumbnailer ?

$thumb=new Thumbnailer("photo.jpg");
$thumb->thumbSquare(48)->save("thumb.jpg");

Результат фото будет 48x48px. Легко ли? :)

0 голосов
/ 07 октября 2009

Возможно, вы также захотите взглянуть на пакет Image_Transform PEAR . Он заботится о многих деталях низкого уровня и делает создание и манипулирование изображениями безболезненными. Он также позволяет использовать библиотеки GD или ImageMagick. Я использовал его с большим успехом в нескольких проектах.

...