ASP.NET – Unire più file immagini TIFF in un singolo TIFF multipagina Una semplice classe helper in ASP.NET C# che consente di unire più file TIFF in una singola immagine TIFF multi-pagina

Classe ASP.NET C# per il controllo e il calcolo formale del Codice Fiscale

Chi non conosce i file TIFF alzi la mano: probabilmente non sarete tra questi, visto che stiamo parlando di uno dei formati  immagine raster più diffusi al giorno d’oggi insieme agli ancor più noti GIF, JPEG e PNG. Nello specifico, TIFF è l’acronimo di Tagged Image File Format, un formato sviluppato originariamente dalla Aldus Corporation e oggi detenuto dalla Adobe dopo l’acquisizione della Aldus, avvenuta nell’agosto del 1994.

Una delle caratteristiche dei file TIFF meno note ai non addetti ai lavori è il multi-page support, ovvero la possibilità di contenere immagini divise su più “pagine” (videate): ad esempio, si possono inserire in un unico file tutte le pagine che compongono un fax. Per questo motivo il formato TIFF è stato molto utilizzato in passato come “contenitore” di immagini provenienti da documenti cartacei – in particolare dai software degli scanner – fino all’affermazione definitiva del formato PDF.

Poiché in passato ci siamo già occupati di come realizzare PDF multi-pagina, come ricorderà chi ha letto il nostro articolo Come unire file GIF, PNG, JPG, TIFF e PDF in un unico file PDF con ASP.NET C# e iTextSharp, questa volta ci occuperemo di risolvere un problema analogo utilizzando il formato TIFF.

Questo è il codice sorgente della classe MergeTiff, pensata per unire qualsiasi tipo di file TIFF (compresi i file TIFF multi-pagina) in un singolo file TIFF multi-pagina:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Ryadel.Components.Media
{
    /// <summary>
    /// A small helper class to handle TIFF files
    /// </summary>
    public static class TiffHelper
    {
        /// <summary>
        /// Merges multiple TIFF files (including multipage TIFFs) into a single multipage TIFF file.
        /// </summary>
        public static byte[] MergeTiff(params byte[][] tiffFiles)
        {
            byte[] tiffMerge = null;
            using (var msMerge = new MemoryStream())
            {
                //get the codec for tiff files
                ImageCodecInfo ici = null;
                foreach (ImageCodecInfo i in ImageCodecInfo.GetImageEncoders())
                    if (i.MimeType == "image/tiff")
                        ici = i;

                Encoder enc = Encoder.SaveFlag;
                EncoderParameters ep = new EncoderParameters(1);

                Bitmap pages = null;
                int frame = 0;

                foreach (var tiffFile in tiffFiles)
                {
                    using (var imageStream = new MemoryStream(tiffFile))
                    {
                        using (Image tiffImage = Image.FromStream(imageStream))
                        {
                            foreach (Guid guid in tiffImage.FrameDimensionsList)
                            {
                                //create the frame dimension 
                                FrameDimension dimension = new FrameDimension(guid);
                                //Gets the total number of frames in the .tiff file 
                                int noOfPages = tiffImage.GetFrameCount(dimension);

                                for (int index = 0; index < noOfPages; index++)
                                {
                                    FrameDimension currentFrame = new FrameDimension(guid);
                                    tiffImage.SelectActiveFrame(currentFrame, index);
                                    using (MemoryStream tempImg = new MemoryStream())
                                    {
                                        tiffImage.Save(tempImg, ImageFormat.Tiff);
                                        {
                                            if (frame == 0)
                                            {
                                                //save the first frame
                                                pages = (Bitmap)Image.FromStream(tempImg);
                                                ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
                                                pages.Save(msMerge, ici, ep);
                                            }
                                            else
                                            {
                                                //save the intermediate frames
                                                ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
                                                pages.SaveAdd((Bitmap)Image.FromStream(tempImg), ep);
                                            }
                                        }
                                        frame++;
                                    }
                                }
                            }
                        }
                    }
                }
                if (frame >0)
                {
                    //flush and close.
                    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
                    pages.SaveAdd(ep);
                }

                msMerge.Position = 0;
                tiffMerge = msMerge.ToArray();
            }
            return tiffMerge;
        }
    }
}

Come si può vedere, il codice sorgente del metodo è piuttosto auto-esplicativo: nel caso in cui abbiate bisogno di maggiori informazioni, sentitevi liberi di inserire le vostre domande nella sezione “commenti” in fondo a questo articolo.

Per il momento è tutto: felice conversione!

AGGIORNAMENTO: questa classe helper è stata utilizzata per realizzare MergeTIFF, una console application realizzata in ASP.NET Core e C# che consente di unire più file TIFF (inclusi TIF multi-pagina) all’interno di un singolo file TIF multi-pagina! Per maggiori informazioni consigliamo di leggere questo articolo e/o di dare un’occhiata al progetto MergeTIFF su GitHub.

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.