Create, Save Tiff Image & Extract Images From TIFF Image

Friend Sub ImagesToTiff(fileName As String, images As Image(), isMultiIFrame As Boolean)

       ' Define an EncoderParameters array
       Dim encoderParams As New EncoderParameters(1)

       ' Define ImageCodecInfo to retrieve information about image encoders and decoder
       Dim encoderInfo As ImageCodecInfo = ImageCodecInfo.GetImageEncoders().First(Function(ie) ie.MimeType = "image/tiff")

       '  define tiff image
       Dim tiff As Image = CType(Nothing, Image)

       ' define the top bitmap
       Dim masterBitmap As Bitmap = CType(Nothing, Image)
       If isMultiIFrame Then
           Dim i As Integer = 0
           While i < images.Length
               If i = 0 Then
                   ' save the top bitmap/frame
                   Dim firstStream As New IO.MemoryStream
                   masterBitmap = images(i)
                   masterBitmap.Save(firstStream, ImageFormat.Tiff)
                   tiff = Image.FromStream(firstStream)
                   encoderParams.Param(0) = New EncoderParameter(Encoder.SaveFlag, CType(EncoderValue.MultiFrame, EncoderParameterValueType))
                   tiff.Save(fileName, encoderInfo, encoderParams)
               Else
                   encoderParams.Param(0) = New EncoderParameter(Encoder.SaveFlag, CType(EncoderValue.FrameDimensionPage, EncoderParameterValueType))
                   Dim secondStream As New IO.MemoryStream
                   Dim img As Image = CType(images(i), Image)
                   img.Save(secondStream, ImageFormat.Tiff)

                   ' add and save more frames to the file or stream specified in a previous call to the Save method.
                   Using frame As Image = Image.FromStream(secondStream)
                       tiff.SaveAdd(frame, encoderParams)
                   End Using

               End If
               If i = images.Length - 1 Then
                   encoderParams.Param(0) = New EncoderParameter(Encoder.SaveFlag, CType(EncoderValue.Flush, EncoderParameterValueType))
                   tiff.SaveAdd(encoderParams)
               End If
               i += 1
           End While
       Else

           Dim j As Integer = 0
           While j < images.Length
               Dim thirdStream As New IO.MemoryStream
               Dim img As Image = CType(images(j), Image)
               img.Save(thirdStream, ImageFormat.Tiff)
               Using frame As Image = Image.FromStream(thirdStream)
                   frame.Save(fileName, ImageFormat.Tiff)
               End Using
               j += 1
           End While
       End If
   End Sub





Friend Sub TiffToImages(fileName As String)
       If IsMultFrameImage(Image.FromFile(fileName)) Then
           Using ImageFile As Image = Image.FromFile(fileName).Clone
               Dim frameDimensions As New FrameDimension(ImageFile.FrameDimensionsList(0))
               Dim count As Integer = ImageFile.GetFrameCount(frameDimensions)
               Dim names As String() = New String(count) {}
               Dim frame As Integer = 0
               While frame < count
                   ImageFile.SelectActiveFrame(frameDimensions, frame)
                   Using bmp As New Bitmap(ImageFile)
                       names(frame) = String.Format("{0}\{1}{2}.jpeg", IO.Path.GetDirectoryName(fileName), IO.Path.GetFileNameWithoutExtension(fileName), frame)
                       bmp.Save(names(frame), ImageFormat.Jpeg)
                   End Using
                   frame += 1
               End While
           End Using
       End If
   End Sub






   Friend Function IsMultFrameImage(img As Image) As Boolean
       Return img IsNot Nothing AndAlso img.RawFormat.Guid = ImageFormat.Tiff.Guid AndAlso ((img.GetFrameCount(New FrameDimension(img.FrameDimensionsList(0)))) > 1)
   End Function





Usage of the Code:
Dim images As Image() = New Image() {My.Resources.tmp_0.Clone(), My.Resources.tmp_1.Clone(), My.Resources.tmp_2, My.Resources.tmp_3.Clone()}

      Dim fileName As String = ".\egyptFlag.tiff"
      ImagesToTiff(fileName, images, True)

      TiffToImages(fileName)


Comments

Popular posts from this blog

مقدمة الي تشفير الحروف الأبجدية العربية

VB.NET Translucent Control using GDI+

Add Custom Event to a Class in VB.NET