2010-10-10 16 views
14

Dada una imagen cargada por el usuario, necesito crear varias miniaturas para visualizar en un sitio web. Estoy usando ImageMagick y estoy tratando de hacer feliz Google PageSpeed. Desafortunadamente, no importa qué valor quality especifique en el comando convert, PageSpeed ​​todavía puede sugerir comprimir la imagen aún más.Google PageSpeed ​​& ImageMagick Compresión JPG

Tenga en cuenta que http://www.imagemagick.org/script/command-line-options.php?ImageMagick=2khj9jcl1gd12mmiu4lbo9p365#quality menciones:

Para los formatos JPEG ... imagen, calidad es 1 [proporciona la] más bajo calidad de imagen y compresión más alta ....

De hecho, incluso probé comprimir la imagen usando 1 (sin embargo, produjo una imagen inutilizable) y PageSpeed ​​todavía sugiere que puedo optimizar esa imagen al "comprimir sin pérdida de tiempo" la imagen. No sé cómo comprimir una imagen más con ImageMagick. ¿Alguna sugerencia?

Aquí está una manera rápida de probar lo que estoy hablando:

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

Creo que quiere que pruebe un formato sin pérdida como PNG. A veces, esto puede proporcionarle una mejor compresión, especialmente para imágenes pequeñas; pero realmente depende del tipo de imagen que carguen los usuarios. –

+1

PageSpeed ​​se refiere a JPG (ya que en realidad proporciona un JPG que se puede guardar). Los usuarios están cargando fotos. – StackOverflowNewbie

+0

Hmm extraño, ¿el JPEG es más pequeño que el creado automáticamente? –

Respuesta

9
  • El JPEG puede contener comentarios, miniaturas o metadatos, que pueden ser eliminados.
  • A veces es posible comprimir archivos JPEG más, manteniendo la misma calidad. Esto es posible si el programa que generó la imagen no usó el algoritmo o los parámetros óptimos para comprimir la imagen. Al volver a comprimir los mismos datos, un optimizador puede reducir el tamaño de la imagen. Esto funciona usando specific Huffman tables para la compresión.

Puede ejecutar jpegtran o jpegoptim en su archivo creado, para reducirlo aún más en tamaño.

+0

Miré las propiedades de las imágenes generadas por ImageMagick. Parece haber conservado los metadatos. ¿Sabes cómo puedo eliminar esto usando ImageMagick? Además, parece que ImageMagick usa tablas de Huffman. Vea la entrada sobre JPEG en http://www.imagemagick.org/script/formats.php. ¿Esto me alivia de la necesidad de explorar jpegtran o jpegoptim? – StackOverflowNewbie

+0

mogrify -strip input.jpg parece funcionar. Sin embargo, no estoy seguro de si es el mejor enfoque. – StackOverflowNewbie

+3

Cada JPEG usa tablas de Huffman. Imagemagick probablemente siempre use las mismas tablas de Huffman, mientras que jpegoptim intenta encontrar la mejor tabla de Huffman personalizada. – Sjoerd

4

Para minimizar aún más los tamaños de las imágenes, debe eliminar todos los metadatos. ImageMagick puede hacer esto agregando un -strip a la línea de comando.

¿Tiene usted también considerado para poner sus imágenes en miniatura como datos codificados en línea base64 d en su HTML?

Esto puede hacer que su carga de la página web mucho más rápido (a pesar de que el tamaño se hace un poco más grande), ya que ahorra el navegador de la ejecución de varias solicitudes de todos los archivos de imagen (las imágenes) que se hace referencia en el código HTML.

Su código HTML para tal imagen se vería así:

<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 /> 

Y que crearía las base64 datos de imagen así:

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

No estoy seguro de que esto sea cierto. Hacer referencia a archivos externos significa que el navegador puede usar múltiples procesadores, núcleos y enlaces de red para solicitar las imágenes (o cualquier otro recurso). HTTP/1.1 tiene cierta sobrecarga para una nueva solicitud que puede superar ese beneficio, pero HTTP/2.0 o SPDY (disponible en muchos navegadores modernos) puede usar una única conexión para realizar múltiples solicitudes a la vez. –

Cuestiones relacionadas