Saltar al contenido

Convierta mapas de bits en una imagen TIFF de varias páginas en .NET 2.0

Solución:

Comience con el primer mapa de bits colocándolo en un objeto Imagen

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

Guarde el mapa de bits en la memoria como tiff

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

Ponga Tiff en otro objeto de imagen

Image tiff = Image.FromStream(byteStream)

Prepare codificadores:

var encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");

EncoderParameters encoderParams = new EncoderParameters(2);
encoderParams.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);
encoderParams.Param[1] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);

Guardar en archivo:

tiff.Save(sOutFilePath, encoderInfo, encoderParams);

Para las páginas siguientes, prepare codificadores:

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

Finalmente vaciar 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 ayudarte a empezar.

Encontré esta publicación después de buscar un poco en Google. Probé el código que estaba en la publicación de a’b’c’d’e’f’g’h ‘, pero 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: Agregar fotogramas a un TIFF de fotogramas múltiples.

Además, aquí está el código que funcionó para mí. Debería ser idéntico a esa publicación.

Encoder encoder = Encoder.SaveFlag;
ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);
            
// Save the first frame of the multi page tiff
Bitmap firstImage = (Bitmap) _scannedPages[0].RawContent;
firstImage.Save(fileName, encoderInfo, encoderParameters);

encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage);

// Add the remaining images to the tiff
for (int i = 1; i < _scannedPages.Count; i++)

   Bitmap img = (Bitmap) _scannedPages[i].RawContent;
   firstImage.SaveAdd(img, encoderParameters);


// Close out the file
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
firstImage.SaveAdd(encoderParameters);

Nigromante
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;
    



Reseñas y puntuaciones de la guía

Si piensas que te ha sido provechoso este artículo, sería de mucha ayuda si lo compartieras con el resto entusiastas de la programación y nos ayudes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *