2014-09-07 2 views
0

Я хочу сделать миниатюру (64X64) изображений, загруженных пользователем, чтобы уменьшить общий размер страницы. Я сделал это, используя следующий PHP-код, но результат действительно разочаровывает! в одном экземпляре исходный размер файла составлял 554 байта (70X70). путем преобразования его в образ 64X64 размер файла увеличился до 1,43 КБ! в то время как качество изображения ужасно ухудшается.Лучший результат при изменении размера изображений в PHP

Что здесь не так? Разве это не другой способ изменить размер изображений с помощью PHP и получить лучший результат?

Большое спасибо

function image_resize($src, $dst, $width, $height, $crop=0){ 

    if(!list($w, $h) = getimagesize($src)) return "Unsupported picture type!"; 

    $type = strtolower(substr(strrchr($src,"."),1)); 
    if($type == 'jpeg') $type = 'jpg'; 

    switch($type){ 
    case 'bmp': $img = imagecreatefromwbmp($src); break; 
    case 'gif': $img = imagecreatefromgif($src); break; 
    case 'jpg': $img = imagecreatefromjpeg($src); break; 
    case 'png': $img = imagecreatefrompng($src); break; 
    default : return "Unsupported picture type!"; 
    } 

    // resize 
    if($crop){ 
    if($w < $width or $h < $height) return "Picture is too small!"; 
    $ratio = max($width/$w, $height/$h); 
    $h = $height/$ratio; 
    $x = ($w - $width/$ratio)/2; 
    $w = $width/$ratio; 
    } 
    else{ 
    if($w < $width and $h < $height) return "Picture is too small!"; 
    $ratio = min($width/$w, $height/$h); 
    $width = $w * $ratio; 
    $height = $h * $ratio; 
    $x = 0; 
    } 

    $new = imagecreatetruecolor($width, $height); 

    // preserve transparency 
    if($type == "gif" or $type == "png"){ 
    imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127)); 
    imagealphablending($new, false); 
    imagesavealpha($new, true); 
    } 

    imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h); 

    switch($type){ 
    case 'bmp': imagewbmp($new, $dst); break; 
    case 'gif': imagegif($new, $dst); break; 
    case 'jpg': imagejpeg($new, $dst); break; 
    case 'png': imagepng($new, $dst); break; 
    } 
    return true; 
} 

ответ

1

Я думаю, что, вероятно, нет ничего плохого здесь. 1.43KB не очень много, поэтому неясно, что созданное изображение неэффективно хранится. Что касается качества изображения, мы говорим о очень маленьком изображении; изменение размера от 70x70 до 64x64, скорее всего, приведет к нечетному результату. Если у вас есть более крупное изображение, чтобы начать с этого, он, вероятно, будет работать лучше.

Существуют и другие библиотеки изображений PHP (например, WideImage), но я был бы удивлен, если бы их использование здесь имело бы большую разницу. На самом деле они, вероятно, вообще используют GD.

+0

спасибо, но другие изображения (чьи первоначальные размеры были больше) в какой-то степени показывают тот же результат. в другом примере 208X242 (2,4 КБ) сокращается до 1,15 КБ, и цвета полностью изменены. – Ormoz

+0

Размер файла снова меня не удивляет. Проблема цвета, с другой стороны, может быть исправлена. – gandaliter

Смежные вопросы