Software per la grafica

Spesso si ha la necessità di creare delle figure schematiche, come diagrammi o schematizzazioni di situazioni reali. Questo è tanto più vero quando si realizza un lavoro scientifico.
Il ricorso a strumenti non adatti allo scopo (Paint, Gimp, ecc...) è frequente ed è dettato dall'ignoranza di strumenti ben più potenti che, oltre ad essere più adatti allo scopo, hanno la possibilità di creare immagini di tipo vettoriale.

In questa pagina voglio raccogliere le mie esperienze nella realizzazione di immagini, grafici, illustrazioni per articoli, libri o semplici appunti. In particolare mi concentrerò sull'indirizzare il lettore verso lo strumento più adatto per ogni esigenza. Un accento particolare verrà messo tra l'interoperabilità dei vari programmi con LaTeX.

Prima di fare una lista dei programmi in questione vogliamo chiarire alcuni concetti basilari. Immagini raster e vettoriali.

Programmi di grafica raster

Gimp, Paint.NET

Programmi di grafica vettoriale

Per creare immagini vettoriali ci sono sostanzialmente due approcci: 1. testuale; 2. grafico.
Il primo è il più comune perché più naturale per un computer. Difatti una immagine vettoriale non è nient'altro che un file di testo con una serie di comandi aderenti ad una certa specifica che poi viene interpretato da un opportuno visualizzatore compatibile con quella specifica. Così funzionano tutti i formati vettoriali come il pdf, ps, eps, svg, ecc... Tutti questi "linguaggi" non sono però adatti ad essere scritti a mano. Quelli più simili ad un linguaggio di programmazione e più facilmente gestibili da un essere umano sono il METAPOST, l'ambiente figure di LaTeX, ecc...

Sebbene i linguaggi come METAPOST siano potentissimi e permettano di generare figure geometriche di elevatissima qualità e precisione non sono certo banali da imparare a meno di dedicare molto tempo al loro studio. Se non si ha quindi la necessità di questa precisione e ci si accontenta di una accuratezza non matematica, è decisamente consigliato usare strumenti grafici. Stavolta saranno loro ad occuparsi della traduzione del vostro disegno nei comandi della specifica usata.

Ecco una lista di programmi di grafica vettoriale che ritengo molto validi. Sono tutti multi-piattaforma e permettono di inserire formule matematiche secondo la sintassi di LaTeX.

Esiste poi in LaTeX l'ambiente picture che permette di creare delle figure descrivendole con del codice sorgente tramite appositi comandi. Analogamente all'ambiente picture sono stati creati degli ambienti simili ma molti più potenti. Tra questi PSTricks (2009) e PGF/Tikz (2008). PSTricks è basato su Postscript e può quindi essere compilato solo con il comando latex. Il secondo invece è un linguaggio PGF con un pacchetto di macro chiamato Tikz e può essere usato sia con latex che con pdflatex. In entrambi i casi sono stati creati moltissimi pacchetti per estenderne le funzionalità in vari ambiti. PSTricks è un po' più potente di PGF per motivi di precisione nei calcoli matematici che è in grado di fare il postscript.

Infine ci sono dei linguaggi come quelli appena descritti ma che sono indipendenti da LaTeX, come ad esempio ePiX (2009) ed Asymptote (2009). Di cui però non conosco alcun frontend.

Immagini di alta qualità e piccola dimensione

Per realizzare un opera di qualità la qualità delle immagini è fondamentale. Quando si tratta di grafici o schemi è bene inoltre usare delle convenzioni ben precise. Per esempio una delle cose più importanti è usare pochi colori e sempre uguali. I libri scientifici ben composti usano solitamente 3 o al massimo 4 colori: bianco di base, nero per le scritte e un particolare tipo di rosso, non troppo acceso. Un altro colore potrebbe essere il blu, anch'esso non troppo acceso.

I grafici è bene che siano tutti immagini vettoriali. Se però avete un numero eccessivo di punti potete usare invece del pdf, il png.

Per ridurre il "peso" delle immagini potete agire solitamente su due fattori: la risoluzione e la profondità del colore. Il jpeg non supporta l'indicizzazione dei colori (indexed colors) mentre il png sì (1, 2, 4, 8 bit che corrispondono a 2, 4, 16, 256 colori). optipng, gimp, ...

Conversione di immagini tra diversi formati

La conversione tra formati raster e da vettoriale a raster è piuttosto semplice mentre la conversione tra formati vettoriali e da formato raster a vettoriale è più rara e difficile. Software: pstoedit. Per LaTeX: oletex package.

Da .jpeg a .eps

Una volta si doveva usare l'ottimo programma jpeg2ps per motivi di dimensione dell'eps generato. Oggi non è più necessario. È sufficiente usare ImageMagick e specificare che l'eps deve essere in Postscript di livello 3.
Un altro programma che sembra promettere molto bene ma che ancora non conosco è bmeps (per Windows è disponibile nel progetto dklibs).

Da .png a .eps

Anche in questo caso, finora l'unico strumento che dava risultati eccellenti era png2eps (un semplice script che usa altri software, in particolare pngcheck, TIFF library, netpbm collection. Vedi GnuWin32). Attualmente è sufficiente usare ImageMagick specificando che l'eps deve essere in Postscript di livello 3.
Un altro programma che sembra promettere molto bene ma che ancora non conosco è bmeps (per Windows è disponibile nel progetto dklibs).

Da .tiff a .png

Per convertire immagini da un formato raster all'altro non c'è strumento migliore di ImageMagick. Inoltre, esiste un'utility, OptiPNG per ottimizzare il PNG (facoltativa nello script esposto sotto). Quest'ultima è un singolo file eseguibile. Per fare in modo che Windows sappia dove sia e quindi lo possa eseguire da qualunque directory, va modificata la PATH di Windows oppure l'eseguibile va copiato in una directory già compresa nella PATH (ad esempio nella cartella radice di ImageMagick).

Da .emf a .eps o .pdf

La conversione di immagini tra formati vettoriali è un campo ancora in evoluzione e con molte lacune, purtroppo non esiste uno strumento potente come lo è ImageMagick per i formati raster.

Una delle conversioni più comuni che vi può capitare tra formati vettoriali è quella da .emf (la nuova versione del .wmf) a .eps o .pdf. Infatti un file .emf è tipico dei sistemi Windows.

Dopo tante ricerche vi presento la maniera migliore per questo tipo di conversione. Lo strumento che permette questa operazione è MetafileToEPSConverter. Potete usarlo sia tramite la sua semplice interfaccia grafica sia da riga di comando.
Da riga di comando basta dare

metafile2eps input.emf output.eps

Ovviamente se vi serve avere un pdf anziché un eps, fate prima l'eps e poi convertitelo in pdf come già spiegato sotto.

Da .pdf o .eps a .emf

Provare il software EmfPrinter.

Da .pdf a .eps

Se avete delle immagini in .pdf e le volete convertire in .eps (senza alcuna perdita di qualità), usate pdf2ps e eps2eps.

Da .eps a .pdf

Se avete delle immagini in .eps e le volete convertire in .pdf (senza alcuna perdita di qualità), usate epstopdf.

Script per le conversioni

Quanto visto finora può essere riassunto nei seguenti script. Vanno chiamati come volete (consiglio image2png.bat, image2eps.bat, image2pdf.bat) purché con estensione .bat e posti nella cartella SendTo del vostro utente. Ovviamente per farli funzionare dovete installare le dipendenze che vi interessano.

image2eps.bat
@echo off

rem   *********************************************************
rem   BATCH SCRIPT FOR CONVERSION OF IMAGE IN EPS FORMAT
rem
rem   Francesco Biccari
rem   2009-11-22
rem   *********************************************************
rem 
rem   PATH SETTINGS
set PATH=%PATH%;"C:\Program Files\gs\gs8.64\bin\"

echo Converting...
FOR %%A IN (%*) DO (
	echo %%A

  rem eps to eps 
  rem clean and crop the eps
  rem dependencies: MiKTeX, Ghostscript
  IF /I %%~xA==.eps (
    eps2eps.bat %%A "%%~nA_opti.eps"
  )
  
  rem pdf to eps
  rem dependencies: MiKTeX, Ghostscript, (another better tool is pdftops (xpdf))
  IF /I %%~xA==.pdf (
    pdf2ps.bat %%A "%%~nA_temp.ps"
    rem pdftops.bat %%A "%%~nA.ps"
    eps2eps.bat "%%~nA_temp.ps" "%%~nA.eps"
    del "%%~nA_temp.ps"
  )
  
  rem png to eps
  rem dependencies: ImageMagick
  IF /I %%~xA==.png (
    convert %%A "eps3:%%~nA.eps"
  )
  
  rem tiff to eps
  rem dependencies: ImageMagick
  IF /I %%~xA==.tiff (
    convert %%A "eps3:%%~nA.eps"
  )
  
  rem jpg to eps
  rem dependencies: ImageMagick
  IF /I %%~xA==.jpg (
    convert %%A "eps3:%%~nA.eps"
  )
  
  rem emf to eps
  rem dependencies: MetafileToEPSConverter, MiKTeX, Ghostscript
  IF /I %%~xA==.emf (
    metafile2eps.exe %%A "%%~nA_temp.eps"
    eps2eps.bat "%%~nA_temp.eps" "%%~nA.eps"
    del "%%~nA_temp.eps"
  )
  
  rem wmf to eps
  rem dependencies: MetafileToEPSConverter, MiKTeX, Ghostscript
  IF /I %%~xA==.wmf (
    metafile2eps.exe %%A "%%~nA_temp.eps"
    eps2eps.bat "%%~nA_temp.eps" "%%~nA.eps"
    del "%%~nA_temp.eps"
  )
  
)

image2pdf.bat
@echo off
@rem   *********************************************************
@rem   BATCH SCRIPT FOR CONVERSION OF IMAGE IN PDF FORMAT
@rem   Dependencies:
@rem   eps: MikTeX (epstopdf, set PATH)
@rem   png: ImageMagick (convert, set PATH), optipng
@rem   jpg: ImageMagick (convert, set PATH)
@rem   *********************************************************
echo Converting...
FOR %%A IN (%*) DO (
	echo %%A
  IF /I %%~xA==.png (
    optipng.exe -o7 -q -out "%%~nA_opti.png" %%A
    convert.exe "%%~nA_opti.png" "%%~nA.pdf"
    del "%%~nA_opti.png"
  )
  IF /I %%~xA==.jpg (
    convert.exe %%A "%%~nA.pdf"
  )
  IF /I %%~xA==.eps (
    epstopdf.exe %%A
  )
)

image2png.bat
@echo off
@rem   *********************************************************
@rem   BATCH SCRIPT FOR CONVERSION OF IMAGE IN PNG FORMAT
@rem   Dependencies:
@rem   tiff: ImageMagick (convert, set PATH), optipng
@rem   jpg: ImageMagick (convert, set PATH), optipng
@rem   eps: ImageMagick (convert, set PATH), optipng
@rem   pdf: ImageMagick (convert, set PATH), optipng
@rem   *********************************************************
echo Converting...
FOR %%A IN (%*) DO (
	echo %%A
  IF /I %%~xA==.jpg (
    convert -strip -quality 100 %%A "%%~nA.png"
    optipng -o7 -q "%%~nA.png"
  )
  IF /I %%~xA==.tiff (
    convert -strip -quality 100 %%A "%%~nA.png"
    optipng -o7 -q "%%~nA.png"
  )
  IF /I %%~xA==.eps (
    convert -strip -quality 100 %%A "%%~nA.png"
    optipng -o7 -q "%%~nA.png"
  )
  IF /I %%~xA==.pdf (
    convert -strip -quality 100 %%A "%%~nA.png"
    optipng -o7 -q "%%~nA.png"
  )
)
pdfcrop.bat
@echo off
echo Cropping...
FOR %%A IN (%*) DO (
  echo %%A
  IF /I %%~xA==.pdf (
    copy /Y %%A "%%~nA.pdf.old"
    cd "%%~dA%%~pA"
    pdfcrop.exe --margins 1 "%%~nA.pdf.old" "%%~nA.pdf"
  )
)

Lavorare con i pdf e i ps

Lettori di pdf

La migliore visualizzazione la offre Adobe Acrobat Reader. A seguire Foxit Reader. Poi PDF XChange e SumatraPDF. Per quanto riguarda la possibilità di commentare i pdf vedi sotto. Foxit Reader va ancora bene per leggere i pdf sullo schermo, gli altri due no. Adobe Acrobat Reader ha invece una chiarezza dei font impressionante. Foxit Reader ha meno possibilità di commenti (anche se quelli base di solito sono sufficienti) rispetto a PDFXChange. Se si vuole usare un solo lettore consiglierei Foxit Reader. SumatraPDF è l'unico PDF viewer adatto per lo sviluppo di documenti in LaTeX. Io infatti uso Foxit Reader e SumatraPDF che sono anche programmi abbastanza leggeri. Se invece i pdf sostanzialmente li leggete e basta meglio Adobe Acrobat Reader, non permette i commenti, è enorme come dimensioni, però è veramente ben fatto.

Strumenti per i pdf

pdf2ps [-dLanguageLevel=3] input.pdf output.ps

Spesso si ha la necessità di ridurre la dimensione di un documento pdf. I font e la maniera in cui vengono inclusi nel pdf hanno un peso notevole. In LaTeX per esempio costa molto di più, in termini di spazio, usare i font di default piuttosto che i Times.

Molte volte il problema di una dimensione eccessiva di un pdf sono le immagini in esso contenute. Come sapete la maniera migliore è quella di ottimizzare le immagini in partenza (cosa facile con LaTeX ma difficile con programmi come Word od OpenOffice dove le immagini vengono "incluse" nel documento). C'è un modo però per diminuire la dimensione delle immagini raster contenute nel pdf direttamente tramite Ghostscript. Questo passaggio potrebbe risultare utile anche a chi ha già ottimizzato le immagini del proprio documento ma vuole realizzare una versione a "bassa risoluzione". Ecco il comando:

gs -sDEVICE=pdfwrite
-dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen
-dNOPAUSE
-dQUIET
-dBATCH
-sOutputFile=output_nomefile.pdf input_nomefile.pdf

Confronto lettori pdf

Tabella 1. Comparazione visualizzatori pdf.
Caratteristica Adobe Reader X Foxit Reader Nitro PDF Reader PDF-XChange Viewer SumatraPDF
Dimensione 37 MB 14 MB 26 MB 18 MB 4.5 MB
Qualità video ottima buona buona scarsa buona
Qualità stampa ottima scarsa buona buona buona
Sticky notes yes yes yes yes no
Highlight Text yesyesyesyesno
Underline Text noyesyesyesno
Strikeout Text noyesyesyesno
Drawing noyesnoyesno
Measure Tools noyesnoyesno
Text yesyesyesyesno
Link to file noyesnonono
Insert image yes**yesyes**yes**no
Insert A/V noyesnonono
Browser plugins yesyesyesyesyes
PDF IFilter yesnonoyesyes
PDF printer nonoyesnono
OCR nononoyesno
Other formats ----eps*, ps*, djvu, chm, xps, cbz, cbr

*: richiede Ghostscript
**: solo firma

Un'utile funzionalità è la possibilità di inserire immagini e video all'interno del pdf. Attenzione che questa funzionalità è diversa dall'Attach file che crea solo una nota in cui è possibile aprire un link esterno. L'inserimento di una immagine è piuttosto utile, considerate per esempio quando dovete aggiungere la vostra firma scannerizzata su un pdf.

Sotto la dicitura shell-extension ricadono due funzionalità. La prima consiste in un componente che permette al sistema operativo di mostrare al posto dell'icona generica un'icona personalizzata con l'immagine della prima pagina (anteprima). La seconda funzionalità consiste in un altro componente che permette al sistema operativo di indicizzare i file pdf al loro interno (ifilter).

Estrazione immagini da un pdf

Per prendere le immagini da un pdf hai varie possibilità:

La più veloce è usare lo snapshot del tuo lettore di pdf. Nelle opzioni devi mettere la risoluzione fissa a valori di 300 px o più. Incolli l'immagine copiata in un programma come gimp, fai le modifiche del caso e la salvi in formato png o jpg a seconda che è un diagramma oppure una fotografia.
GIUDIZIO: facilissimo ma le immagini sono raster

Se devi estrarre tutte le immagini insieme puoi provare a installare xpdf (c'è sia per Linux che Windows). Comprende vari programmini a riga di comando tra cui pdfimages. Lanciando questo programma sul tuo pdf verranno salvate tutte le immagini raster al suo interno. Questo significa che le immagini vettoriali NON vengono estratte.
GIUDIZIO: complicato per chi non sa usare la riga di comando. Le immagini prodotte sono salvate in formato pnm/ppm oppure con un'opzione le immagini che originalmente erano in jpg vengono salvate in jpg.

Puoi usare pdfill. Ha l'interfaccia grafica ma non permette di vedere dove si sta tagliando. Devi regolare numericamente le distanze dai bordi della pagina e basta.
GIUDIZIO: tedioso. Però ottieni immagini vettoriali (se lo erano in partenza) in pdf.

Puoi usare il programma briss che invece ti fa vedere dove stai tagliando (briss)
GIUDIZIO: in teoria ottimo ma non sono mai riuscito a farlo funzionare come si deve. Ottieni immagini vettoriali in pdf (se lo erano in partenza).