Alternative di imaging Python
-
10-07-2019 - |
Domanda
Ho un codice Python che deve fare solo un paio di cose semplici da fotografare: ritagliare, ridimensionare e sovrapporre una filigrana. Ho usato PIL e i risultati di ricampionamento / ridimensionamento sono TERRIBILI. Ho usato imagemagick e l'interfaccia e i comandi sono stati progettati impacchettando un gatto in una scatola, e poi gettandolo ripetutamente giù da una rampa di scale su una tastiera.
Sto cercando qualcosa che non sia PIL o Imagemagick che posso usare con Python per fare trasformazioni di immagini semplici e di alta qualità. Del resto, non deve nemmeno avere i collegamenti python se l'interfaccia della riga di comando è buona.
Oh, e deve essere relativamente indipendente dalla piattaforma, i nostri server di produzione sono Linux, ma alcuni dei nostri sviluppatori si sviluppano su Windows. Non può nemmeno richiedere l'installazione di un gruppo di stupidi codici gui da utilizzare come libreria.
Soluzione
Ho usato PIL e i risultati di ricampionamento / ridimensionamento sono TERRIBILI.
Non dovrebbero essere, purché tu:
- utilizza solo il filtro Image.ANTIALIAS per le operazioni di ridimensionamento
- utilizza solo il filtro Image.BICUBIC per le operazioni di upscaling.
- ricordati di convertire in modalità colore 'RGB' prima del ridimensionamento se stai usando un'immagine palettizzata
- non usare .thumbnail (). è una schifezza
- imposta il livello
quality =
su qualcosa di appropriato durante il salvataggio di JPEG (il valore predefinito è piuttosto basso)
Altri suggerimenti
Non sono sicuro del motivo per cui Image.thumbnail stia ottenendo tale difetto. Nella presente versione che sto esaurendo fa poco più che capire la dimensione desiderata e ridimensionare l'immagine in posizione. Finché stai usando il filtro di ricampionamento corretto e converti prima in RGB (come dice Bobince) la miniatura non dovrebbe essere diversa dal ridimensionamento.
Ecco la fonte effettiva del metodo di anteprima:
def thumbnail(self, size, resample=NEAREST):
# preserve aspect ratio
x, y = self.size
if x > size[0]: y = max(y * size[0] / x, 1); x = size[0]
if y > size[1]: x = max(x * size[1] / y, 1); y = size[1]
size = x, y
if size == self.size:
return
self.draft(None, size)
self.load()
try:
im = self.resize(size, resample)
except ValueError:
if resample != ANTIALIAS:
raise
im = self.resize(size, NEAREST) # fallback
self.im = im.im
self.mode = im.mode
self.size = size
self.readonly = 0
PIL può fare un buon ridimensionamento. Assicurati che l'immagine sorgente sia in modalità RGB, non nei colori della tavolozza, e prova le diverse scelte dell'algoritmo.
Hai controllato pypi ? Una ricerca rapida mostra alcuni strumenti relativi alle immagini lì, ho anche scoperto python-gd, nessun indizio su quanto possa essere utile.
Non ho mai avuto problemi con PIL da solo, ma un certo tipo di varietà potrebbe essere interessante.
GIMP ha un'interfaccia a riga di comando ragionevole, credo.
Dai un'occhiata ad alcune di queste librerie di imaging:
hxxp: //pypi.python.org/pypi/collective.croppingimagefield/0.1beta ??p>
hxxp: //pypi.python.org/pypi/cropresize/0.1.1
hxxp: //pypi.python.org/pypi/image_resize/1.0
L'ultima volta che ho confrontato, l'output di questo downscaler è quasi identico a quello del "cubic" di GIMP Opzione:
import Image
def stretch(im, size, filter=Image.NEAREST):
im.load()
im = im._new(im.im.stretch(size, filter))
return im
IIRC, le differenze sono visivamente indistinguibili - alcuni valori di pixel +/- 1 a causa dell'arrotondamento e tendono ad essere arrotondati ai bordi. Non è nemmeno lento.
cf: http: //www.mail-archive .com / immagine-sig @ python.org / msg00248.html
Ho usato PIL e i risultati di ricampionamento / ridimensionamento sono TERRIBILI.
Il ridimensionamento in PIL è stato interrotto in molti modi e PIL non viene mantenuto per lungo tempo. A partire da Pillow 2.7 la maggior parte dei problemi è stata risolta con un netto miglioramento delle prestazioni. Assicurati di utilizzare ultimo cuscino .