2010-10-10 25 views
14

Étant donné qu'une image téléchargée par l'utilisateur, j'ai besoin de créer plusieurs miniatures pour l'affichage sur un site Web. J'utilise ImageMagick et essaye de rendre Google PageSpeed ​​heureux. Malheureusement, quelle que soit la valeur quality que je spécifie dans la commande convert, PageSpeed ​​est toujours capable de suggérer de compresser l'image encore plus loin.Compression de Google PageSpeed ​​et ImageMagick JPG

Notez que http://www.imagemagick.org/script/command-line-options.php?ImageMagick=2khj9jcl1gd12mmiu4lbo9p365#quality mentions:

Pour les JPEG ... formats d'image, la qualité est 1 [offre la] plus bas qualité d'image et compression la plus élevée ....

J'ai même testé la compression de l'image en utilisant 1 (elle a produit une image inutilisable, cependant) et PageSpeed ​​suggère toujours que je peux encore optimiser une telle image en "compressant sans perte" l'image. Je ne sais plus comment compresser une image avec ImageMagick. Des suggestions?

est ici un moyen rapide de tester ce que je parle:

assert_options(ASSERT_BAIL, TRUE); 

// TODO: specify valid image here 
$input_filename = 'Dock.jpg'; 

assert(file_exists($input_filename)); 

$qualities = array('100', '75', '50', '25', '1'); 
$geometries = array('100x100', '250x250', '400x400'); 

foreach($qualities as $quality) 
{ 
    echo("<h1>$quality</h1>"); 
    foreach ($geometries as $geometry) 
    { 
     $output_filename = "$geometry-$quality.jpg"; 

     $command = "convert -units PixelsPerInch -density 72x72 -quality $quality -resize $geometry $input_filename $output_filename"; 
     $output = array(); 
     $return = 0; 
     exec($command, $output, $return); 

     echo('<img src="' . $output_filename . '" />'); 

     assert(file_exists($output_filename)); 
     assert($output === array()); 
     assert($return === 0); 
    } 

    echo ('<br/>'); 
} 
+0

Je pense qu'il veut que vous essayiez un format sans perte comme PNG. Parfois, cela peut vous donner une meilleure compression, en particulier pour les petites images; mais cela dépend vraiment du type d'image que les utilisateurs téléchargent. –

+1

PageSpeed ​​fait référence à JPG (car il fournit réellement un fichier JPG qui peut être sauvegardé). Les utilisateurs téléchargent des photos. – StackOverflowNewbie

+0

Hmm étrange, le JPEG est-il plus petit que celui créé automatiquement? –

Répondre

9
  • Le JPEG peut contenir des commentaires, des vignettes ou des métadonnées, qui peuvent être enlevés.
  • Il est parfois possible de compresser davantage les fichiers JPEG tout en conservant la même qualité. Ceci est possible si le programme qui a généré l'image n'a pas utilisé l'algorithme ou les paramètres optimaux pour compresser l'image. En recompressant les mêmes données, un optimiseur peut réduire la taille de l'image. Cela fonctionne en utilisant specific Huffman tables pour la compression.

Vous pouvez exécuter jpegtran ou jpegoptim sur votre fichier créé, afin de réduire davantage la taille.

+0

J'ai regardé les propriétés des images générées par ImageMagick. Il semble avoir retenu les métadonnées. Donc, vous savez comment je peux supprimer cela en utilisant ImageMagick? En outre, il semble que ImageMagick utilise des tables Huffman. Voir l'entrée sur JPEG à l'adresse http://www.imagemagick.org/script/formats.php. Est-ce que cela me soulage de la nécessité d'explorer jpegtran ou jpegoptim? – StackOverflowNewbie

+0

mogrify -strip input.jpg semble fonctionner. Je ne sais pas si c'est la meilleure approche, cependant. – StackOverflowNewbie

+3

Chaque fichier JPEG utilise des tables Huffman. Imagemagick utilise probablement toujours les mêmes tables de Huffman, alors que jpegoptim essaye de trouver la meilleure table de Huffman personnalisée. – Sjoerd

4

Pour réduire au minimum les tailles d'image, vous devez supprimer toutes les métadonnées. ImageMagick peut le faire en ajoutant un -strip à la ligne de commande.

Avez-vous aussi considéré dans votre code HTML pour placer vos images miniatures en tant que données codées en ligne base64 dans le code HTML?

Cela peut rendre votre page web charge beaucoup plus rapide (même si la taille devient un peu plus), car il enregistre le navigateur d'exécuter plusieurs requêtes pour tous les fichiers d'image (les images) qui sont référencés dans le code HTML.

Votre code HTML pour une telle image devrait ressembler à ceci:

<IMG SRC="data:image/png;base64, 
     iVBORw0KGgoAAAANSUhEUgAAAM4AAABJAQMAAABPZIvnAAAABGdBTUEAALGPC/xh 
     BQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAA 
     OpgAABdwnLpRPAAAAAZQTFRFAAAA/wAAG/+NIgAAAAF0Uk5TAEDm2GYAAAABYktH 
     RACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAB6ElEQVQ4y+3UQY7bIBQG4IeQ 
     yqYaLhANV+iyi9FwpS69iGyiLuZYpepF6A1YskC8/uCA7SgZtVI3lcoiivkIxu/9 
     MdH/8U+N6el2pk0oFyibWyr1Q3+PlO2NqJV+/BnRPMjcJ9zrfJ/U+zQ9oAvo+QGF 
     d+npPqFQn++TXElkrEpEJhAtlTBR6dNHUuzIMhFnEhxAmJDkKxlmt7ATXDDJYcaE 
     r4Txqtkl42VYSH+t9KrD9b5nxZeog/LWGVHprGInGWVQUTvjDWXca5KdsowqyGSc 
     DrZRlGlQUl4kQwpUjiSS9gI9VdECZhHFQ2I+UE2CHJQfkNxTNKCl0RkURqlLowJK 
     1h1p3sjc0CJD39D4BIqD7JvvpH/GAxl2/YSq9mtHSHknga7OKNOHKyEdaFC2Dh1w 
     9VSJemBeGuHgMuh24EynK03YM1Lr83OjUle38aVSfTblT424rl4LhdglsUag5RB5 
     uBJSJBIiELSzaAeIN0pUlEeZEMeClC4cBuH6mxOlgPjC3uLproUCWfy58WPN/MZR 
     86ghc888yNdD0Tj8eAucasl2I5LqX19I7EmEjaYjSb9R/G1SYfQA7ZBuT5H6WwDt 
     UAfK1BOJmh/eZnKLeKvZ/vA8qonCpj1h6djfbqvW620Tva36++MXUkNDlFREMVkA 
     AAAldEVYdGRhdGU6Y3JlYXRlADIwMTItMDgtMjJUMDg6Mzc6NDUrMDI6MDBTUnmt 
     AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEyLTA4LTIyVDA4OjM3OjQ1KzAyOjAwIg/B 
     EQAAAA50RVh0bGFiZWwAImdvb2dsZSJdcbX4AAAAAElFTkSuQmCC" 
    ALT="google" WIDTH=214 HEIGHT=57 VSPACE=5 HSPACE=5 BORDER=0 /> 

Et vous créez les base64 données d'image comme ceci:

base64 -i image.jpg -o image.b64 
+0

Je ne suis pas sûr que ce soit vrai. Le référencement de fichiers externes signifie que le navigateur peut utiliser plusieurs processeurs, cœurs et liens réseau pour demander les images (ou toute autre ressource). HTTP/1.1 a une surcharge pour une nouvelle requête qui peut l'emporter sur ce bénéfice, mais HTTP/2.0 ou SPDY (disponible dans de nombreux navigateurs modernes) est capable d'utiliser une seule connexion pour faire plusieurs requêtes à la fois. –