11
votes

PHP ImageCopyResamplié de mauvaise qualité

J'ai un script PHP qui enregistre l'image d'origine, puis la redimensionner - une vignette et une image plus grande pour la visualisation Web. Cela fonctionne bien sauf avec des images que la qualité est terrible. Il semble être sauvé avec une palette de couleurs très basse. Vous pouvez voir le résultat chez http://kalpaititch.com/index.php?filter=white < / a> - Cliquez sur la première vignette avec le titre "blanc blanc blanc"

ci-dessous est le code utilisé pour le rééchantillonnage de l'image: xxx

Merci

ps [Les photos supprimées du serveur]

et voici le reste du code de téléchargement: xxx


5 commentaires

Pouvez-vous montrer un exemple avant-après?


Je ne suis pas clair à 100%, mais cela ressemble à certaines des images que vous obtenez sont une certaine taille et votre script le redimensionne réellement plus grand qu'il n'est arrivé à l'origine? La qualité sera terrible si vous faites cela.


Non, le script redimensionnera l'image proportionnellement si une seule taille est donnée. Si deux tailles sont données, il redimensionnera et la récolte le reste sans changer le rapport d'aspect. Les images réélombées sont toujours beaucoup plus basses que l'image d'origine. L'avant photo ci-dessus n'est pas l'original, ils sont à la fois la même résolution, mais le précédent est enregistré avec Photoshop et l'après une sauvegarde avec mon script.


Où est le reste du script? Cela pourrait être la fonction de sortie d'image que vous utilisez. Essayez d'utiliser ImagePng () pour sortir l'image et définissez la qualité de compression sur '0' pour les tests. US2.php.net/manual/fr/function.Imagepng.php


J'ai fait un test rapide et imagePng () ne semblait pas avoir une énorme différence. Eh bien aucun vraiment. Mais je pose l'autre moitié pertinente du script FYI.


4 Réponses :


2
votes

Eh bien, la documentation php.net dit que vous devez avoir une image imagecreateTuecolor () pour votre Dest_Image si vous souhaitez éviter d'utiliser seulement une palette de 255 couleurs, mais vous le faites déjà.

Je suppose qu'une alternative serait d'utiliser un outil externe tel que ImageMagick avec un système système () .


2 commentaires

Oui, pas sûr que PHP est très utile. Comme vous pouvez le constater, j'ai fait une troisième image de test en utilisant ImageCopyResized, qui figure un peu mieux mais pas assez.


Merci, en utilisant imagecreateTuecolor résolu le problème que je connaissais avec mes images personnalisées ayant un nombre de couleurs bas!



26
votes

La perte de qualité n'est pas versée non à ImageCopyResamped () , mais à la compression JPEG. Malheureusement, les algorithmes de compression de GD ne correspondent pas à Photoshop - en fait, très peu sont. Mais vous pouvez améliorer le résultat: le niveau de compression JPG par défaut de GD est de 75 sur 100.

Vous pouvez augmenter la qualité à l'aide du troisième paramètre sur imagejpeg () (que je suppose que vous utilisez pour la sortie finale): xxx

joue dans le 90 -100 gamme. L'image deviendra plus grande en taille de fichier que l'original - cela va être le prix que vous payez. Mais il devrait être possible d'atteindre une qualité comparable.

Alternativement, comme le dit John Himmelman, essayez d'utiliser imagepng () pour une meilleure qualité - aussi au prix d'un Taille de fichier notamment plus grande, bien sûr.


3 commentaires

Comme un dernier petit point pour quiconque est curieux. J'ai changé la qualité imagejpeg () à 99 et je suis loin d'une grande meilleure image. Bien que la différence entre cela et la valeur par défaut est une augmentation de 1 000% de la fichier (par défaut entre 12kb, compression de haute qualité à 110kb)


Juste une suggestion que j'ai proposée après avoir lu ceci. Avec mon système de vignettes, il n'est pas nécessaire que la vignette soit le même format que l'image de taille complète d'origine, ma fonction utilitaire est posée "Quel est le fichier miniature de cette image et existe-t-il déjà?" Donc, si vous interrogez sur File.jpg, il reviendrait avec Thumbnail_Cache / File.jpg. J'ai modifié cette approche pour toujours répondre avec des vignettes de format .png, donc si vous interrogez sur File.jpg, il revient avec Thumbnail_Cache / File.png et génère une vignette PNG. Cela évite toute inquiétude concernant la compression GD JPG.


Le résultat de la rééchantillonnage est floue, et c'est un problème de GD, ne pas supporter les Lanczos. Un hack doit redimensionner à 200%, puis à 100% (50%) en utilisant des images scale. Ce n'est pas Lanczos, mais plus net. Imagemagick est toujours meilleur.



0
votes
function img_resize( $tmpname, $size, $save_dir, $save_name, $maxisheight = 0 )
{
    $save_dir .= ( substr($save_dir,-1) != "/") ? "/" : "";
    $gis = getimagesize($tmpname);
    $type = $gis[2];

    switch($type)
    {
        case "1": $imorig = imagecreatefromgif($tmpname); break;
        case "2": $imorig = imagecreatefromjpeg($tmpname);break;
        case "3": $imorig = imagecreatefrompng($tmpname); break;
        default:  $imorig = imagecreatefromjpeg($tmpname);
    }

    $x = imagesx($imorig);
    $y = imagesy($imorig);

    $woh = (!$maxisheight)? $gis[0] : $gis[1] ;
    if($woh <= $size)
    {
        $aw = $x;
        $ah = $y;
    }
    else
    {
        if(!$maxisheight)
        {
            $aw = $size;
            $ah = $size * $y / $x;
        }
        else
        {
            $aw = $size * $x / $y;
            $ah = $size;
        }
    }
    $im = imagecreatetruecolor($aw,$ah);

    if (imagecopyresampled($im,$imorig , 0,0,0,0,$aw,$ah,$x,$y))

    if (imagejpeg($im, $save_dir.$save_name))

        return true;

    else

        return false;

}

1 commentaires

Très peu d'informations sur ce qui se passe réellement dans cette fonction. Quelle devrait être la taille? un tableau? un string? pourcentage?



2
votes

Le tour rapide est de faire les vignettes 1000 x 1000 pixels (ou plus) sur ImageCopyResized () puis définissez la qualité JPEG sur 20 < / strong> ou moins sur imagejpeg ($ img, $ savePath, 20); . La sortie sera généralement plus petite que 100 kb .

Laissez le client CSS effectuer le redimensionnement et les images seront rapides pour charger et regarder sans faille dans les navigateurs modernes lors de la taille de la taille de la vignette.


0 commentaires