2010-01-03 7 views
11

Il y a quelque temps, j'ai utilisé un service d'optimisation PNG appelé (je pense) "smush it". Vous l'avez alimenté un lien Web et il a retourné un zip de toutes les images PNG avec leur taille de fichier bien, bien, smushed ...Outils d'optimisation PNG

Je veux mettre en œuvre une fonctionnalité d'optimisation similaire dans le cadre du processus de téléchargement d'image de mon site Web; Est-ce que quelqu'un sait d'une bibliothèque préexistante (PHP ou Python de préférence) que je peux exploiter pour cela? Un bref Google m'a orienté vers plusieurs outils de style de ligne de commande, mais je préfère ne pas descendre cette route si possible.

+2

Je ne pense pas que l'un des outils populaires (optipng , pngcrush, et c.) ont des liaisons. ImageMagick (pour PHP) et PIL (pour Python) vous obtiendront quelque part en modifiant les paramètres de sortie, mais les outils de ligne de commande sont plus fortement optimisés. –

Répondre

14

Exécuter avec PHP cet outil de ligne de commande

pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB -brute -l 9 -max -reduce -m 0 -q IMAGE 
    optipng -o7 -q pngout.png 
    pngout pngout.png -q -y -k0 -s0 
    advpng -z -4 pngout.png > /dev/null 
+1

hey, ça fait 6 ans mais j'ai remarqué que vous étiez en ligne donc - ce sont une liste décente d'outils. pouvez-vous lister tous les outils de compression pour png/jpg et similaires? J'ai juste besoin d'une liste de noms de ce que vous utilisez/comme, puisque ces outils sont bons, je suppose que vous avez peut-être trouvé quelque chose de mieux dans 6 ans :) Merci d'avance. bonne réponse. – S00

3

Tant que votre PHP est compilé avec le support GD2 (assez courant de nos jours):

<?php 
$image = imagecreatefromstring(file_get_contents('/path/to/image.original.png')); 
imagepng($image, '/path/to/image.smushed.png', 9); 

Cela lu dans tout format d'image GD2 comprend (et pas seulement PNG) et la sortie PNG gzip comme la compression maximale niveau sans sacrifier la qualité.

Cependant, il pourrait être moins utile aujourd'hui qu'il y a quelques années; la plupart des éditeurs d'images le font déjà, car gzipping ne coûte pas autant de ressources CPU que par le passé.

+0

Merci, mais je suis après quelque chose qui va au-delà de la simple manipulation, c'est-à-dire en supprimant la correction des couleurs et les informations gamma. – Mathew

+0

Bien que je sois d'accord qu'il existe d'autres techniques d'optimisation en dehors de la simple compression, faire ce que vous demandez n'est pas _optimizing_, mais plutôt _destroying_ l'image téléchargée. – Mike

+0

Bah! Sémantique! :) Comme un point de correction cependant: Ce que je demande ne détruit pas l'image en aucune façon, plutôt l'image est optimisée en détruisant certaines informations (inutiles). – Mathew

2

Avez-vous entendu parler de PNGCrush? Vous pouvez consulter la source, partie de PNG and MNG Tools at SourceForge, et transcrire ou envelopper dans Python.

+1

PNGcrush est plus rapide que n'importe quelle solution Python pure, et l'appel de programmes externes est facile en Python. L'inconvénient le plus évident est que votre système d'exploitation a un coût extrêmement élevé pour engendrer un nouveau processus, par ex. Les fenêtres. – Theran

+0

Je doute en quelque sorte que la création d'un nouveau processus pour chaque téléchargement de fichiers est une bonne idée quel que soit votre système d'exploitation. – Eric

2

Je doute la sagesse de jeter d'autres morceaux (comme gAMA et iCCP), mais si c'est ce que vous voulez faire est assez facile à utiliser PyPNG pour enlever des morceaux:

#!/usr/bin/env python 
import png 
import sys 

input=sys.stdin 
out=sys.stdout 

def critical_chunks(chunks): 
    for type,data in chunks: 
     if type[0].isupper(): 
      yield type,data 

chunks = png.Reader(file=input).chunks() 
png.write_chunks(out, critical_chunks(chunks)) 

la fonction critical_chunks est- filtrant essentiellement tout sauf les morceaux critiques de PNG (le type de 4 lettres pour un morceau critique commence par une lettre majuscule).

+0

Cela ne modifie pas la compression zlib, car elle passe les morceaux intacts. –