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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
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!