La libreria comune

Il contenitore delle procedure
La cabina di guida del treno del Renon
La cabina di guida del treno del Renon

La libreria raccoglie un gran numero di classi raggruppate in quattro sezioni sezioni specializzate più altre non raccolte in specifiche cartelle.

Le sessioni specializzate, che saranno trattate in apposite pagine comprendono:

Di seguito invece analizzeremo le altre classi definite nella libreria a cominciare da quella riportata nel Listato 3 (Nuova pagina), dove vengono definiti i formati delle carte de visite, delle credit card e delle stampe standard che produce il mio service abituale.

La classe può essere inizializzata passando al costruttore la risoluzione in dpi desiderata, per default viene impostata a 300dpi.

Questa informazione è fondamentale perchè ImageMagick lavora esclusivamente con le dimensioni in pixel e quindi diventa fondamentale la funzione di decodifica:

/// <summary>
/// Converts mm to pixels
/// </summary>
/// <param name="mm">size to convert</param>
/// <returns>pixel at defined resolution</returns>
public int ToPixels(int mm) => (int)(mm * _dpi / _inch);

In questo modo la definizione dei formati si ottiene semplicemente con:

/// <summary>
/// Horizontal Carte de Visite, 100x64mm
/// </summary>
public MagickGeometry CDV_Full_o => new(ToPixels(100), ToPixels(64));

Un'altra classe, (Listato 4 (Nuova pagina)), crea le immagini vuote dei formati precedentemente definiti.

Al costruttore può essere passato un intero con la risoluzione in DPI, una istanza della classe Formats oppure, se lasciato vuoto, viene impostata una risoluzione di 300 DPI.

L'immagine vuota di una carte de viste orizzontale viene definita come:

/// <summary>
/// Horizontal Carte de Visite, 100x64mm
/// </summary>
/// <param name="c">Background color</param>
/// <returns></returns>
public MagickImage CDV_Full_o(MagickColor c) => new(c, fmt.CDV_Full_o.Width, fmt.CDV_Full_o.Height);

Di tutte queste definizioni esiste anche il relativo overload che crea una immagine bianca.

/// <summary>
/// Horizontal Carte de Visite, 100x64mm
/// </summary>
/// <remarks>White background</remarks>
/// <returns></returns>
public MagickImage CDV_Full_o() => CDV_Full_o(MagickColors.White);

C'è poi una libreria che si occupa di gestire i nomi dei colori (Listato 5 (Nuova pagina)), utilizzata nella gestione della riga di comando, dove con l'opzione --colors, comune a tutti i programmi, si ottiene l'elenco dei nomi dei colori predefiniti (l'output potete trovarlo nel Listato 5a (Nuova pagina)) da utilizzare al posto dei valori RGB esadecimali.

Della libreria di servizio fa parte anche la classe statica del Listato 6 (Nuova pagina) che gestisce alcuni messaggi e le funzioni per la scalatura e la rotazione delle immagini che vedremo in dettaglio.

Il metodo Utils.AutoRotate restituisce l'immagine ruotata nello stesso verso del formato (il secondo parametro); la sua implementazione è:

/// <summary>
/// Rotates an image according to the given geometry
/// </summary>
/// <param name="img">image to rotate</param>
/// <param name="size">reference geometry</param>
/// <returns>rotated image</returns>
public static MagickImage AutoRotate(MagickImage img, MagickGeometry size)
{
        MagickImage i = (MagickImage)img.Clone();
        if (size.Height > size.Width)
        {
                // output must be portrait
                if (img.Height < img.Width)
                        i.Rotate(-90);
        }
        else
        {
                // output must be landscape
                if (img.Height > img.Width)
                        i.Rotate(-90);
        }
        return i;
}

Il metodo Utils.ResizeAndFill scala l'immagine in modo che sia contenuta all'interno del formato e riempie lo spazio vuoto con il colore indicato nel terzo parametro.

E' presente anche un overload, senza il parametro colore, che imposta il bianco come colore di riempimento.

La sua implementazione, nella versione completa, è:

/// <summary>
/// Resizes an image to the given geometry.<br/>
/// Empty space is filled with the given color
/// </summary>
/// <param name="img">Image to resize</param>
/// <param name="size">target size</param>
/// <param name="fill">color to fill the empty space</param>
/// <returns>Image resized and filled</returns>
public static MagickImage ResizeAndFill(MagickImage img, MagickGeometry size, MagickColor fill)
{
        MagickImage i = (MagickImage)img.Clone();
        i.Resize(size);
        i.Extent(size, Gravity.Center, fill);
        return i;
}

Infine il metodo Utils.RotateResizeAndFill combina le azioni dei due metodi precedenti.

Anche in questo caso è presente anche un overload, senza il parametro colore, che imposta il bianco come colore di riempimento.

Vediamo la sua semplicissima implementazione:

/// <summary>
/// Resizes an image to the given geometry.<br/>
/// Before resizing the image is rotated with <see cref="AutoRotate"/>.<br/>
/// Empty space is filled with the given color.
/// </summary>
/// <param name="img">Image to process</param>
/// <param name="size">reference size and orientation</param>
/// <param name="fill">fill color</param>
/// <returns>processed image</returns>
public static MagickImage RotateResizeAndFill(MagickImage img, MagickGeometry size, MagickColor fill) =>
        ResizeAndFill(AutoRotate(img, size), size, fill);

Applicando questa trasformazione ai file caricati si ottiene di poter automaticamente gestire oltre un centinaio di formati di file, in qualsiasi dimensione ed orientamento con una banale riga di codice:

MagickImage dorso = Utils.RotateResizeAndFill(new(filename), fmt.CDV_Full_v, FillColor);
Inizio pagina
 
Precedente
Sommario
Successivo