3 votes

Redimensionnement des images : Qualité médiocre des jpeg et fonds noirs PNG

Finale : J'ai décidé d'utiliser ça en gros : http://shiftingpixel.com/2008/03/03/smart-image-resizer/

Comme il gère tout, j'ai désactivé la mise en cache et je le fais dans les contrôleurs d'administration :

    $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 : J'ai trouvé que cela fonctionne, mais cela crée des bords très nets, cela ne semble pas correct.

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

Des idées ?

Bonjour,

J'ai deux problèmes avec mon cours, la qualité des images jpeg est assez mauvaise, mais je ne suis pas sûr que cela soit dû au redimensionnement de mon ratio. Idéalement, j'aimerais que cette classe soit stricte sur la taille des images et qu'elle les recadre, mais je n'arrive pas à m'y retrouver.

Mon principal problème est que les pngs ont toujours un fond noir, est-ce que quelqu'un a une expérience dans ce domaine ?

<?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;
        }

}

2voto

Alix Axel Points 63455

En ce qui concerne la qualité de l'image JPEG, vous devez utiliser le troisième argument de l'option imagejpeg() :

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

En ce qui concerne la transparence des PNG, vous vous y prenez mal. Votre script est horrible et a des problèmes fondamentaux, je vais vous laisser avec un révisé qui corrige vos deux problèmes. Il peut encore être optimisé mais j'ai choisi de laisser certaines de vos erreurs originales moins importantes pour que vous ne vous sentiez pas perdu :

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;
        }
    }
}

Je suis désolé de ne pas avoir souligné explicitement vos erreurs mais elles sont si nombreuses et il est 3 heures du matin ici, j'ai besoin de dormir - étudiez-le et lisez le manuel, si vous avez des doutes faites-le moi savoir.

-1voto

acm Points 2854

Il y a beaucoup d'articles sur le web qui traitent de cette question...

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

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

Aussi, à propos de la qualité d'image JPEG,

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

Faites-moi savoir si cela vous aide.

-1voto

dqhendricks Points 11630

Ce lien vous mènera à une fonction simple qui va soit recadrer l'image pour l'adapter, soit la mettre en boîte pendant le redimensionnement en fonction des arguments de la fonction. il y a également une explication assez complète de ce que fait la fonction.

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

Edit : lien corrigé.

-1voto

Freelancer Points 1422

Je trouve cette classe très utile, et vraiment simple à utiliser. La qualité des images est excellente, même si je n'ai travaillé qu'avec des fichiers jpg jusqu'à présent.

Cela vaut la peine de vérifier : http://phpthumb.gxdlabs.com/

-1voto

imad Points 44

Vous pouvez également changer la couleur de fond des fichiers jpg et autres après avoir défini la couleur de fond.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X