Resim yeniden boyutlandırma: Kötü jpeg kalitesi ve siyah PNG arka

5 Cevap php

Final: Ben temelde kullanmaya karar verdim: http://shiftingpixel.com/2008/03/03/smart-image-resizer/

Her şeyi kolları gibi, Ive önbelleğe alma kapalı ve yönetici kontrolörleri bunu:

    $image = file_get_contents(SITE_ADMIN_IMAGE.'/SmartImage.php?width='.$this->thumb_width.'&height='.$this->thumb_height.'&image=/images/'.$this->image_directory.'/'.$formData['image_url'].'');
    file_put_contents(ROOT_PATH.'/public/images/'.$this->image_directory.'/thumb/'.$formData['image_url'], $image);

EDIT: Ben bu işleri buldum ancak çok keskin kenarlar oluşturur, bu doğru görünmüyor.

    imagecolortransparent($dstImage, $background);
    imagealphablending($dstImage, false);
    $colorTransparent = imagecolorallocatealpha($dstImage, 0, 0, 0, 127);
    imagefill($dstImage, 0, 0, $colorTransparent);
    imagesavealpha($dstImage, true);
    imagepng($dstImage, $toWhere);

Fikirler?

Merhaba,

Benim sınıfı ile iki sorunları var, temelde jpeg görüntülerin kalitesi oldukça kötü, ama emin değilim şu benim oranı boyutlandırma aşağı eğer. İdeal bu sınıf görüntü boyutları ve içlerine kırpma ile sıkı olmak istiyorum, ama ben başımı alınamıyor.

Benim ana sorun herkes bu olay ile deneyimi var, pngs her zaman siyah bg olması?

<?php


    class OpenSource_ImageResize {


        function __construct($theFile, $toWhere, $mime, $extension, $newWidth, $newHeight) {

            if ($mime == NULL) {
                $mime = getimagesize($theFile);
                $mime = $mime['mime'];
            }


            if ($mime == 'image/jpeg') {
                $size = getimagesize($theFile);

                if ($size[0] > $newWidth || $size[1] > $newHeight) {
                    $sourceImage = imagecreatefromjpeg($theFile);
                } else {
                    return copy($theFile, $toWhere);
                    throw new exception('Could not create jpeg');
                    return false;
                }
            } else if ($mime == 'image/png') {
                $size = getimagesize($theFile);

                if ($size[0] > $newWidth || $size[1] > $newHeight) {
                    $sourceImage = imagecreatefrompng($theFile);
                } else {
                    return copy($theFile, $toWhere);
                    //throw new exception('Could not create png');
                    return false;
                }
            } else if ($mime == 'image/gif') {
                $size = getimagesize($theFile);

                if ($size[0] > $newWidth || $size[1] > $newHeight) {
                    $sourceImage = imagecreatefromgif ($theFile);
                } else {
                    return copy($theFile, $toWhere);
                    //throw new exception('Could not create gif');
                    return false;
                }
            } else {
                throw new exception('Not a valid mime type');
                return false;
            }

                $oldX = imageSX($sourceImage); 
                $oldY = imageSY($sourceImage); 

                if ($newWidth == NULL) {
                    $thumbHeight = $newHeight;
                    $thumbWidth = round($newHeight/($oldY/$oldX));
                } else 

                if ($oldX > $oldY) {
                    $thumbWidth = $newWidth; 
                    $thumbHeight = $oldY * ($newHeight/$oldX);
                } 

                if ($oldX < $oldY) {
                    $thumbWidth = round($newHeight/($oldY/$oldX));
                    $thumbHeight = $newHeight;
                }

                if ($oldX == $oldY) {
                    $thumbWidth = $newWidth; 
                    $thumbHeight = $newHeight;
                }

                    if (!gd_info()) {
                        $dstImage = ImageCreate($thumbWidth, $thumbHeight); 
                        imagecopyresized($dstImage, $sourceImage, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $oldX, $oldY);
                    } else {
                        $dstImage = ImageCreateTrueColor($thumbWidth, $thumbHeight); 
                        imagecopyresampled($dstImage, $sourceImage, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $oldX, $oldY);
                    } 

                    if ($mime == 'image/png') {
                        $xparent = imagecolorresolvealpha($dstImage, 255,2,240, 0) ;
                        imagecolortransparent($dstImage,$xparent);
                        imagealphablending($dstImage,true);
                        imagepng($dstImage, $toWhere);

                    } else if ($mime == 'image/jpeg') { 
                        imagejpeg($dstImage, $toWhere);

                    } else if ($mime == 'image/gif') {
                        imagegif ($dstImage, $toWhere);

                    }

                    imagedestroy($dstImage); 
                    imagedestroy($sourceImage);
                    return true;
        }

}

5 Cevap

JPEG görüntü kalitesi ile ilgili size üçüncü argümanın faydalanmak gerekir imagejpeg() :

imagejpeg($dstImage, $toWhere, 90); // any value above 85 should be fine

PNG Şeffaflık ile ilgili, yanlış yapıyorsun. Script korkunç ve temel sorunları var, sana senin sorunların hem giderir revize biri ile bırakıyoruz. Hala daha da optimize edilebilir ama kayıp hissetmiyorum böylece orijinal daha az önemli hatalar bazı bırakmak için seçin:

class OpenSource_ImageResize
{
    // $extension is not used?
    function __construct($theFile, $toWhere, $mime, $extension, $newWidth, $newHeight)
    {
        $sourceImage = ImageCreateFromString(file_get_contents($theFile));

        if (is_resource($sourceImage))
        {
            $info = getimagesize($theFile);

            if (is_null($mime))
            {
                $mime = $info['mime'];
            }

            if ($info[0] <= $newWidth && $info[1] <= $newHeight)
            {
                imagedestroy($sourceImage);
                return copy($theFile, $toWhere);
            }

            if (is_null($newWidth))
            {
                $thumbHeight = $newHeight;
                $thumbWidth = round($newHeight/($info[1]/$info[0]));
            }

            else if ($info[0] > $info[1])
            {
                $thumbWidth = $newWidth;
                $thumbHeight = $info[1] * ($newHeight/$info[0]);
            }

            if ($info[0] < $info[1])
            {
                $thumbWidth = round($newHeight/($info[1]/$info[0]));
                $thumbHeight = $newHeight;
            }

            if ($info[0] == $info[1])
            {
                $thumbWidth = $newWidth;
                $thumbHeight = $newHeight;
            }

            $dstImage = ImageCreateTrueColor($thumbWidth, $thumbHeight);

            /* fix PNG transparency issues */           
            ImageFill($dstImage, 0, 0, IMG_COLOR_TRANSPARENT);
            ImageSaveAlpha($dstImage, true);
            ImageAlphaBlending($dstImage, true);

            imagecopyresampled($dstImage, $sourceImage, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $info[0], $info[1]);

            switch ($mime)
            {
                case 'image/png':
                    imagepng($dstImage, $toWhere, 9); // compress it (level 1 to 9)
                break;

                case 'image/jpeg':
                    imagejpeg($dstImage, $toWhere, 90); // quality = 90 (1 to 100, default is "about" 75)
                break;

                case 'image/gif':
                    imagegif($dstImage, $toWhere);
                break;
            }

            imagedestroy($dstImage);
            imagedestroy($sourceImage);

            return true;
        }
    }
}

Ben açıkça hataları işaret olmadığı için üzgünüm ama bu kadar çoktur ve burada 03:00 bulunuyor, bazı uyku almak gerekir - bu çalışma ve manuel okumak, herhangi bir şüphe bana bildirin varsa.

Bu sorunu ele web etrafında mesajların bir yeri vardır ...

http://php.net/manual/en/function.imagecopyresampled.php#93166

http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/

Ayrıca, JPEG görüntü kalitesi hakkında,

http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing-in-php

Bu yardımcı olur bana bildirin.

Bu bağlantı bu işlevin argümanlara dayalı olarak yeniden boyutlandırma sırasında olacak ya ekin-to-fit, ya da mektup kutusu görüntüyü basit bir işlev götürecektir. aynı zamanda işlevi yapıyor ne gibi oldukça kapsamlı bir açıklaması vardır.

https://www.spotlesswebdesign.com/blog.php?id=1

I find this class to be very useful, and really simple to use. Gives great quality of images, though I worked with jpg's only so far.

Kontrol değer: http://phpthumb.gxdlabs.com/

Küf color.You de arka plan rengini tanımlayan sonra jpg ve diğer dosyaları arka plan rengini değiştirebilirsiniz sizin sınıfın png arka planda tanımlar.