php kalitesiz imagecopyresampled

2 Cevap php

Ben, orijinal görüntüyü kaydeder bir php komut dosyası var o zaman boyutlandırır - bir minik ve web görüntüleme için tek bir büyük resim. Bu kalite korkunç bazı görüntüler haricinde iyi çalışır. Bu çok düşük bir renk palet ile kaydedilmiş gibi görünüyor. Başlığı 'beyaz beyaz' ile ilk küçük resme tıklayın - http://kalpaitch.com/index.php?filter=white de sonucu görebilirsiniz

Aşağıdaki görüntü yeniden örnekleme için kullanılan kod:

function resizeImg($name, $extension, $size1, $size2) {
if (preg_match('/jpg|jpeg|JPG|JPEG/',$extension)){
    $image = imagecreatefromjpeg($name);
}
if (preg_match('/gif|GIF/',$extension)){
    $image = imagecreatefromgif($name);
}

$old_width = imageSX($image);
$old_height = imageSY($image);
$old_aspect_ratio = $old_width/$old_height; 

if($size2 == 0){
    $new_aspect_ratio = $old_aspect_ratio;
    if($old_width > $old_height){
        $new_width = $size1;
        $new_height = $new_width / $old_aspect_ratio;
    } else {
        $new_height = $size1;
        $new_width = $new_height * $old_aspect_ratio;
    }
} elseif($size2 > 0){
    $new_aspect_ratio = $size1/$size2;
    //for landscape potographs
    if($old_aspect_ratio >= $new_aspect_ratio) {
        $x1 = round(($old_width - ($old_width * ($new_aspect_ratio/$old_aspect_ratio)))/2);
        $old_width = round($old_width * ($new_aspect_ratio/$old_aspect_ratio));
        $y1 = 0;
        $new_width = $size1;
        $new_height = $size2;
        //for portrait photographs
    } else{
        $x1 = 0;
        $y1 = 0;
        $old_height = round($old_width/$new_aspect_ratio);
        $new_width = $size1;
        $new_height = $size2;
    }
}

$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $image, 0, 0, $x1, $y1, $new_width, $new_height, $old_width, $old_height);

return $new_image;

Çok teşekkürler

P.S. [photos removed from server]

Ve burada yükleme koduna geri kalanı:

// Move the original to the right place
        $result = @move_uploaded_file($image['tmp_name'], $origlocation);

        // Resize the image and save the thumbnail
        $new_image = resizeImg($origlocation, $extension, 500, 0);

        if (preg_match("/gif/",$extension)){
            imagegif($new_image, $normallocation); 
        } else {
            imagejpeg($new_image, $normallocation); 
        }

        // Resize the image and save the thumbnail
        $new_image = resizeImg($origlocation, $extension, 190, 120);

        if (preg_match("/gif/",$extension)){
            imagegif($new_image, $thumblocation); 
        } else { 
            imagejpeg($new_image, $thumblocation);
        }

2 Cevap

Kalite kaybı imagecopyresampled(), ama JPEG sıkıştırma aşağı değildir. Ne yazık ki, GD'nin sıkıştırma algoritmaları Photoshop'un hiçbir maç - aslında, çok az vardır. Ama sonuç artırabilirsiniz: GD'nin varsayılan JPG sıkıştırma seviyesi 100 75'tir.

Sen üçüncü parametre kullanarak kalitesini yükseltmek imagejpeg() (Ben son çıkış için kullandığınız varsayıyorum):

imagejpeg  ( $new_image, null, 99);

90-100 aralığında etrafında oynayın. Görüntü orijinal daha dosya boyutu daha büyük olacak - ki ödediğiniz fiyat olacak. Ama Benzer kalite elde etmek mümkün olmalıdır.

John Himmelman zaten açıklamalarda diyor Alternatif olarak, imagepng() daha iyi kalite için kullanmayı deneyin - Ayrıca özellikle büyük dosya boyutu fiyata tabii.

iyi, php.net belgeleri yalnızca 255 renk paleti kullanarak kaçınmak istiyorum ama zaten bunu eğer dest_image için imagecreatetruecolor () görüntü olması gerektiğini söylüyor.

Ben alternatif bir sistem () çağrısı ile böyle imagemagick gibi harici araçları kullanmak olacaktır sanırım.