Convierte bitmaps a una imagen TIFF multipágina en .NET 2.0

¿Cómo puedo convertir una matriz de mapas de bits en una nueva imagen de formato TIFF, agregando todos los mapas de bits como marcos en esta nueva imagen tiff?

usando .NET 2.0.

Comience con el primer bitmap poniéndolo en un objeto de imagen

Bitmap bitmap = (Bitmap)Image.FromFile(file); 

Guarde el bitmap en la memoria como tiff

 MemoryStream byteStream = new MemoryStream(); bitmap.Save(byteStream, ImageFormat.Tiff); 

Poner Tiff en otro objeto de imagen

 Image tiff = Image.FromStream(byteStream) 

Preparar codificadores:

 ImageCodecInfo encoderInfo = GetEncoderInfo("image/tiff"); EncoderParameters encoderParams = new EncoderParameters(2); EncoderParameter parameter = new EncoderParameter( Encoder.Compression, (long)EncoderValue.CompressionCCITT4); encoderParams.Param[0] = parameter; parameter = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame); encoderParams.Param[1] = parameter; 

Guardar en archivo:

 tiff.Save(sOutFilePath, encoderInfo, encoderParams); 

Para las páginas siguientes, prepare los codificadores:

 EncoderParameters EncoderParams = new EncoderParameters(2); EncoderParameter SaveEncodeParam = new EncoderParameter( Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); EncoderParameter CompressionEncodeParam = new EncoderParameter( Encoder.Compression, (long)EncoderValue.CompressionCCITT4); EncoderParams.Param[0] = CompressionEncodeParam; EncoderParams.Param[1] = SaveEncodeParam; tiff.SaveAdd(/* next image as tiff - do the same as above with memory */, EncoderParams); 

Finalmente purgue el archivo:

 EncoderParameter SaveEncodeParam = new EncoderParameter( Encoder.SaveFlag, (long)EncoderValue.Flush); EncoderParams = new EncoderParameters(1); EncoderParams.Param[0] = SaveEncodeParam; tiff.SaveAdd(EncoderParams); 

Eso debería hacerte comenzar.

Encontré esta publicación después de buscar un poco en Google. Probé el código que estaba en la publicación por a’b’c’d’e’f’g’h ‘, pero eso no funcionó para mí. Quizás, no estaba haciendo algo correctamente.

En cualquier caso, encontré otra publicación que guardaba imágenes en tiffs de varias páginas. Aquí está el enlace a la publicación: http://sofes.miximages.com/c%23/ww1.bobpowell.netf); firstImage = (Bitmap)Image.FromStream(ms1); } // Save the first frame of the multi page tiff firstImage.Save(sOutFile, encoderInfo, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called } encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage); Bitmap imagePage; // Add the remining images to the tiff for (int i = 1; i < pagesbase64Array.Length; i++) { using (MemoryStream ms1 = new MemoryStream()) { using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(pagesbase64Array[i]))) { Image.FromStream(ms).Save(ms1, ImageFormat.Tiff); imagePage = (Bitmap)Image.FromStream(ms1); } firstImage.SaveAdd(imagePage, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called } } } catch (Exception) { //ensure the errors are not missed while allowing for flush in finally block so files dont get locked up. throw; } finally { // Close out the file encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); firstImage.SaveAdd(encoderParameters); } }

Como no soy fanático de la trayectoria de Microsoft en lo que respecta a la gestión y creación de archivos de formatos estandarizados, sugeriría usar ImageMagick, disponible como una biblioteca .Net en la forma de MagickNet (cuidado, http://midimick.com/magicknet/ actualmente tiene una ventana emergente de spyware, he alertado al propietario del sitio).

Aquí está la operación dividida del archivo multi-tiff. Funciona igual que la función de cadena subserie. El primer índice de imagen será su MasterBitMap y seguirá agregando fotogtwig al MasterBitmap hasta el final del índice.

 public void SaveMultiFrameTiff(int start, int end) { string outputFileName = "out.TIF"; string inputFileName = "input.TIF"; try { Bitmap MasterBitmap = new Bitmap(inputFileName ); //Start page of document(master) Image imageAdd = Image.FromFile(inputFileName ); //Frame Image that will be added to the master Guid guid = imageAdd.FrameDimensionsList[0]; //GUID FrameDimension dimension = new FrameDimension(guid); // start index cannot be less than 0 and cannot be greater than frame count if (start < 1 || end > MasterBitmap.GetFrameCount(dimension)) { return; } EncoderParameters ep = new EncoderParameters(1); //Get Image Codec Information ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo codecInfo = codecs[3]; //image/tiff //MultiFrame Encoding format EncoderParameter epMultiFrame = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); ep.Param[0] = epMultiFrame; MasterBitmap.SelectActiveFrame(dimension, start - 1); MasterBitmap.Save(outputFileName, codecInfo, ep);//create master document //FrameDimensionPage Encoding format EncoderParameter epFrameDimensionPage = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); ep.Param[0] = epFrameDimensionPage; for (int i = start; i < end; i++) { imageAdd.SelectActiveFrame(dimension, i);//select next frame MasterBitmap.SaveAdd(new Bitmap(imageAdd), ep);//add it to the master } //Flush Encoding format EncoderParameter epFlush = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush); ep.Param[0] = epFlush; MasterBitmap.SaveAdd(ep); //flush the file } catch (Exception ex) { throw ex; } } } 

Nigromancia
La respuesta aceptada es un poco vaga.
Aquí está el código de trabajo completo:

 public class MultiPageTiff { private static System.Drawing.Imaging.ImageCodecInfo GetEncoderInfo(string mimeType) { System.Drawing.Imaging.ImageCodecInfo[] encoders = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); if (encoders != null) { for (int i = 0; i < encoders.Length; i++) { if (encoders[i].MimeType == mimeType) { return encoders[i]; } // End if (encoders[i].MimeType == mimeType) } // Next i } // End if (encoders != null) return null; } // End Function GetEncoderInfo public static System.Drawing.Image Generate(string[] filez) { System.Drawing.Image multiPageFile = null; byte[] ba = null; System.Drawing.Imaging.ImageCodecInfo tiffCodec = GetEncoderInfo("image/tiff"); using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { for (int i = 0; i < filez.Length; ++i) { using (System.Drawing.Image inputImage = System.Drawing.Image.FromFile(filez[i])) { using (System.IO.MemoryStream byteStream = new System.IO.MemoryStream()) { inputImage.Save(byteStream, System.Drawing.Imaging.ImageFormat.Tiff); if (i == 0) { multiPageFile = System.Drawing.Image.FromStream(byteStream); multiPageFile = SaveImages(tiffCodec, ms, multiPageFile, null); } else { using (System.Drawing.Image tiffImage = System.Drawing.Image.FromStream(byteStream)) { multiPageFile = SaveImages(tiffCodec, ms, tiffImage, multiPageFile); } // End Using tiffImage } } // End Using byteStream } // End Using inputImage } // Next i ba = ms.ToArray(); } // End Using ms System.IO.File.WriteAllBytes(@"d:\mytiff.tiff", ba); //if (multiPageFile != null) //{ // multiPageFile.Dispose(); // multiPageFile = null; //} return multiPageFile; } private static System.Drawing.Image SaveImages( System.Drawing.Imaging.ImageCodecInfo tiffCodec , System.IO.MemoryStream outputStream , System.Drawing.Image tiffImage, System.Drawing.Image firstImage) { using (System.Drawing.Imaging.EncoderParameters encParameters = new System.Drawing.Imaging.EncoderParameters(3)) { if (firstImage == null) { encParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter( System.Drawing.Imaging.Encoder.SaveFlag , (long)System.Drawing.Imaging.EncoderValue.MultiFrame // 18L ); } else { encParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter( System.Drawing.Imaging.Encoder.SaveFlag , (long)System.Drawing.Imaging.EncoderValue.FrameDimensionPage // 23L ); } encParameters.Param[1] = new System.Drawing.Imaging.EncoderParameter( System.Drawing.Imaging.Encoder.ColorDepth, 24L ); encParameters.Param[2] = new System.Drawing.Imaging.EncoderParameter( System.Drawing.Imaging.Encoder.Compression , (long)System.Drawing.Imaging.EncoderValue.CompressionLZW ); if (firstImage == null) { firstImage = tiffImage; ((System.Drawing.Bitmap)tiffImage).SetResolution(96, 96); firstImage.Save(outputStream, tiffCodec, encParameters); } else { ((System.Drawing.Bitmap)tiffImage).SetResolution(96, 96); firstImage.SaveAdd(tiffImage, encParameters); } if (encParameters.Param[0] != null) encParameters.Param[0].Dispose(); if (encParameters.Param[1] != null) encParameters.Param[1].Dispose(); if (encParameters.Param[2] != null) encParameters.Param[2].Dispose(); } // End Using encParameters return firstImage; } }