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: p> Merci P > ps
[Les photos supprimées du serveur] p> et voici le reste du code de téléchargement: p>
4 Réponses :
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à. P>
Je suppose qu'une alternative serait d'utiliser un outil externe tel que ImageMagick avec un système système () . p>
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!
La perte de qualité n'est pas versée non à Vous pouvez augmenter la qualité à l'aide du troisième paramètre sur imagejpeg () strong> (que je suppose que vous utilisez pour la sortie finale): p> 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. P> Alternativement, comme le dit John Himmelman, essayez d'utiliser ImageCopyResamped () Code>, 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. imagepng () code> pour une meilleure qualité - aussi au prix d'un Taille de fichier notamment plus grande, bien sûr. p> p>
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.
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;
}
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?
Le tour rapide est de faire les vignettes 1000 x 1000 pixels strong> (ou plus) sur 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. P> ImageCopyResized () code> puis définissez la qualité imagejpeg ($ img, $ savePath, 20); code>. La sortie sera généralement plus petite que
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.