تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Create, Save Tiff Image & Extract Images From TIFF Image
#1
السلام عليكم ورحمة الله وبركاته

الهدف من هذا الموضوع هو توضيح الكود اللازم لبناء صورة من النوع TIFF و اضافة أكثر من صورة لها و حفظها علي الكمبيوتر ثم بعد ذلك استخلاص جميع الصور منها و حفظها أيضا علي الكمبيوتر

هذا الموضوع يمكن اعتباره إمتدادا للموضوع الموجود في اللينك Introduction To Screen Capture ولكن تم كتابته بشكل منفصل لأنه أيضا يمكن استخدامه لتوضيح كيفية التعامل مع االصور من النوع TIFF خاصة وأنه يمكن استخدامها لبناء أشياء شبيهة بملفات PDF مثلا و الكلمة TIFF هي اختصار للكلمات : Tagged Image File Format


ملفات TIFF هي شبيهة جدا بملفات GIF لذلك يمكن استخدامها لتخزين أكثر من صورة داخلها ولكنها ليست متحركة مثل ملفات  GIF لذلك إن أردت أن تستخدمها مثل ملفات GIF او مثل ملفات PDF عليك أن تستخلص منها جميع الصور الموجودة داخلها

ملفات TIFF ممكن ان نجفظ بها صورة واحدة فقط أو أكثر من صورة و علي الأقل يجب أن يكون بها صورة واحدة وهي الصورة التي ستكون في اعلي كل الصور و التي تخفي خلفها بقية الصور

عموما ملفات TIFF يمكن استخدامها بأكثر من اسلوب لحفظ البيانات علي هيئة صورة او علي هيئة مجموعة من الصور

الكود التالي يوضح كيفية حفظ صورة واحدة أو مجموعة من الصور في ملف من النوع TIFF


كود :
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

الكود اتالي يوضح كيفية استخلاص الصور الموجودة داخل ملف من النوع TIFF

كود :
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



الكود التالي يوضيح كيفية استخدام الأكواد أعلاه لبناء صورة من النوع TIFF و حفظها علي جهاز الكمبيوتر أو عرضها داخل PictureBox و أيضا يوضح كيفية استخلاص الصور الموجود في ملف من النوع TIFF وحفظها علي جهاز الكمبيوتر أيضا

كود :
 ' استخدام مجموعة من الصور و حفظها علي هيئة صورة واحدة
       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)

       ' عرض الصورة
       Dim stockImage As Image = Image.FromFile(fileName)
       PictureBox1.Image = stockImage

       ' استخلاص الصور
       TiffToImages(fileName)


الكود كاملا موجود بالمرفقات

المراجع

EncoderParameters
ImageCodecInfo
Image SaveAdd Method
Image Save Method
Stream Class


الملفات المرفقة
.rar   Test_TiffImage.rar (الحجم : 111.75 ك ب / التحميلات : 145)
الرد }}}



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم