2010-01-03 2 views
11

Un po 'di tempo fa ho utilizzato un servizio di ottimizzazione PNG chiamato (credo) "smush". Hai alimentato un link e ha restituito un file zip di tutte le immagini PNG con i loro filesizes piacevolmente, bene, arrossati ...Strumenti di ottimizzazione PNG

Desidero implementare una funzione di ottimizzazione simile come parte del processo di caricamento delle immagini del mio sito web; qualcuno sa di una libreria preesistente (preferibilmente PHP o Python) a cui posso attingere per questo? Un breve Google mi ha indirizzato verso diversi strumenti a linea di comando, ma preferirei non seguire questa strada se possibile.

+2

non credo che uno qualsiasi degli strumenti popolari (optipng , pngcrush, et c.) hanno attacchi. ImageMagick (per PHP) e PIL (per Python) ti portano da qualche parte modificando le impostazioni di output, ma gli strumenti della riga di comando sono più ottimizzati. –

risposta

14

Esegui con PHP questa riga di comando strumenti

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, sono passati 6 anni ma ho notato che eri online così - questi sono una lista decente di strumenti. puoi elencare tutti gli strumenti di compressione per png/jpg e simili? Ho solo bisogno di una lista di nomi di quello che usi/mi piace, dato che questi strumenti sono buoni. Sospetto che tu abbia trovato qualcosa di meglio in 6 anni :) Grazie in anticipo. ottima risposta – S00

3

Finché il PHP è compilato con il supporto GD2 (abbastanza comune al giorno d'oggi):

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

Questo leggerà in qualsiasi formato di immagine GD2 capisce (non solo PNG) e l'uscita di un PNG formato gzip, come la compressione massima livello senza sacrificare la qualità.

Oggi potrebbe essere meno utile rispetto a anni fa; la maggior parte degli editor di immagini lo fa già, dal momento che gzipping non costa più tanto CPU quanto prima.

+0

Grazie, ma sto cercando qualcosa che vada oltre il semplice gzipping, ovvero rimuovendo la correzione del colore e le informazioni sulla gamma. – Mathew

+0

Anche se sono d'accordo ci sono altre tecniche di ottimizzazione oltre alla semplice compressione, facendo quello che stai chiedendo non è _optimizing_, ma piuttosto _destroying_ l'immagine caricata. – Mike

+0

Bah! Semantica! :) Come punto di correttezza però: quello che sto chiedendo non è di distruggere l'immagine in alcun modo, piuttosto l'immagine viene ottimizzata distruggendo alcune parti di informazioni (inutili). – Mathew

2

Avete sentito parlare di PNGCrush? Puoi controllare la fonte, parte di PNG and MNG Tools at SourceForge, e trascriverlo o includerlo in Python.

+1

PNGcrush è più veloce di qualsiasi altra soluzione Python pura, e la chiamata a programmi esterni è semplice in Python. Il lato negativo più ovvio è se il tuo sistema operativo ha un costo estremamente elevato per generare un nuovo processo, ad es. Finestre. – Theran

+0

In qualche modo dubito che generare un nuovo processo per ogni caricamento di file sia una buona idea indipendentemente dal sistema operativo. – Eric

2

vorrei mettere in discussione la saggezza di buttare via altri pezzi (come Gama e ICCP), ma se è questo che si vuole fare è abbastanza facile da usare PyPNG per rimuovere pezzi:

#!/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 funzione critical_chunks è essenzialmente filtrando tutti tranne i pezzi critici di PNG (il tipo di 4 lettere per un blocco critico inizia con una lettera maiuscola).

+0

Questo non ha modificato la compressione di zlib, dal momento che passa i blocchi non toccati. –