تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Convert Bitmap To Integer & Viceversa
#1
السلام عليكم ورحمة الله وبركاته

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

لكن هل فكرت يوما في تخزين الصورة علي هيئة رقم ثم ومن هذا الرقم يتم استرجاع الصورة

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

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


الفكرة
فكرة هذا الموضوع تنحصر في تحويل الصورة الي IntPtr أو الي Handle ثم يتم استخراج الصورة مرة أخري من هذا IntPtr


الخطوات التالية توضح كيفية تنفيذ الفكرة

 أولا تحويل الصورة الي رقم
1- يتم تعريف متغير يعبر عن أي صورة
2- استخلاص IntPtr الخاص بتلك الصورة عن طريق استخدام الدالة Bitmap.GetHbitmap
3- تحويل IntPtr الي رقم من النوع Int64 أو إلي Int32
[b]
الدالة التالية توضح كيفية تحويل الصورة إلي رقم حيث يمكن لاحقا تخزين هذ الرقم في ملف بكل سهولة
[/b]



PHP كود :
Friend Function BitmapToInteger(bmp As Bitmap) As Integer
        Dim ptr 
As System.IntPtr System.IntPtr.Zero
        Dim result 
As Integer CType(NothingInteger)
 
       If bmp IsNot Nothing Then
            ptr 
bmp.GetHbitmap()
 
       End If
 
       result ptr.ToInt32
        
' OR, you may use 
        '
result ptr.ToInt64
        If ptr 
<> IntPtr.Zero Then
            ptr 
IntPtr.Zero
        End 
If

 
       Return result
    End 
Function 

ثانيا تحويل الرقم الي صورة
هذا الأمر يحدث باستخدام الدالة Image.FromHbitmap وهنا فقط علينا أن نمرر الرقم الذي حصلنا عليه من الخطوات أعلاه الي تلك الدالة


الدالة التالية توضح كيفية تحويل الرقم إلي صورة


PHP كود :
Friend Function IntegerToBitmap(value As Integer) As Bitmap
        Return Bitmap
.FromHbitmap(value)
 
   End Function 

كيفية استخدام الكود

PHP كود :
 Dim bmp As Bitmap CType(My.Resources.ResourceManager.GetObject("TestingImage"), Bitmap)
 
       Dim bitmapInteger As Integer BitmapToInteger(bmp)


PictureBox1.Image CType(IntegerToBitmap(bitmapInteger), Bitmap

أتمني ان الموضوع يكون مفيدا لكم
تقبلو تحياتي
الرد }}}
#2
شكرا على مشاركة الكود ،، دائما تجعلني ابحث بمواضيع جديده اخ silverlight

على العموم عند تطبيق فكرتك فانها تعمل بكل كفاءه و لكن عند حفظ الرقم و اغلاق البرنامج و تشغيله مره اخرى لا أستطيع الاستفاده من الرقم بشيء و كانه فقط كان يشير الى موقع بذاكرة الجهاز و بمجرد اغلاق و فتح البرنامج مره اخرى و محاولة استرجاع الصورة مره اخرى لا تظهر ،، في الحقيقه بحثت قليلا عن الدوال التي استخدمتها وكانها فقط مؤشرات ..


على العموم مبادرة جميله و اتمنى ان اكون فقط انا الغلطان لانها لو كانت صحيحه فهي مناسبه لي كثيراً ،
اسم معرفي : محمد يحيى
الرد }}}
تم الشكر بواسطة: HASAN6.0
#3
القيمة التي نحصل عليها هنا عبارة عن ما يسمي HBitmap و هي تمثل GDI Object و الرقم الذي يعبر عنها يقوم بالإحتفاظ بكل المعلومات عن الصورة و علي فكرة انا قمت بحفظ الصورة في ملف و استطعت استردادها من نفس الملف و بدون اي مشاكل حتي بعد أن قمت بإغلاق الكمبيوتر تم استرجاع الصوة من نفس الرقم

عموما لو ان الكود لا يعمل معك جيدا انا لدي كود اخر يقوم بتحوبل الصورة الي بايت وذلك باستخدام  LockBytes and UnLockBytes و يتم استرجاع الصورة بنفس الأسلوب و هذا الكود يعتبر من أسرع طرق حفظ الصورة علي الإطلاق و لاحقا سأضع لك الكود هذا

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

PHP كود :
Private Const DataFileName As String ".\data.bin"

 
   Friend Function BitmapToInteger(bmp As Bitmap) As Integer
        Dim ptr 
As System.IntPtr System.IntPtr.Zero
        Dim result 
As Integer CType(NothingInteger)
 
       If bmp IsNot Nothing Then
            ptr 
bmp.GetHbitmap()
 
       End If
 
       result ptr.ToInt32
        
' OR, you may use 
        '
result ptr.ToInt64
        If ptr 
<> IntPtr.Zero Then
            ptr 
IntPtr.Zero
        End 
If

 
       Return result
    End 
Function

 
   Friend Function IntegerToBitmap(value As Integer) As Bitmap
        Return Bitmap
.FromHbitmap(value)
 
   End Function

 
   Private Function WriteDataToFile(bmp As Bitmapfilename As String) As Boolean
        Dim characterEncoding 
As System.Text.Encoding CType(NothingSystem.Text.Encoding)

 
       If characterEncoding Is Nothing Then
            Dim encoder 
As System.Text.Encoding CType(System.Text.Encoding.UTF8.Clone(), System.Text.Encoding)
 
           encoder.EncoderFallback System.Text.EncoderFallback.ReplacementFallback
            characterEncoding 
encoder
        End 
If

 
       Using writer As New System.IO.BinaryWriter(System.IO.File.Open(filenameSystem.IO.FileMode.Create), characterEncoding)
 
           Dim i As Integer BitmapToInteger(bmp)
 
           writer.Write(i)

 
           Return True
        End Using
        Return False
    End 
Function

 
   Private Function ReadDataFromFile(filename As String) As Bitmap
        Dim bmp 
As Bitmap CType(NothingBitmap)
 
       If (System.IO.File.Exists(filename)) Then
            Using reader 
As New System.IO.BinaryReader(System.IO.File.Open(filenameSystem.IO.FileMode.Open), New System.Text.UTF8Encoding(FalseFalse))
 
               Dim i As Integer reader.ReadInt32
                bmp 
IntegerToBitmap(i)
 
           End Using
        End 
If
 
       Return bmp
    End 
Function 

و الكود التالي يوضح كيف يتم استخدام الكود اعلاه لحفظ الصورة وهنا انا قمت بتعريف  صورة موجودة في Resources المشروع
ثم وباستخدام الأكواد اعلاه قمت بتجويل الصورة الي رقم ثم قمت بحفظها في ملف ومكان هذا الملف هو فهرس المشروع و يمكن ان تغير مكان حفظ الملف كيفما شئت
وأيضا قمت بعرض الصورة في PictureBox بعد استرداد الصورة من الرقم و هذا للتوضيح فقط

PHP كود :
Dim bmp As Bitmap CType(My.Resources.ResourceManager.GetObject("TestingImage"), Bitmap)
 
       Dim bitmapInteger As Integer BitmapToInteger(bmp)

 
       PictureBox1.Image CType(IntegerToBitmap(bitmapInteger), Bitmap)
 
       If WriteDataToFile(CType(My.Resources.ResourceManager.GetObject("TestingImage"), Bitmap), DataFileNameThen
            MessageBox
.Show("Bitmap has been saved to file")
 
       Else
            MessageBox
.Show("Do Not know how to save bitmap to file")
 
       End If 

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

PHP كود :
 Me.BackgroundImage CType(ReadDataFromFile(DataFileName), Bitmap

اتمني تكتب لنا كيف قمت أنت باستخدام الكود لأنه ومن المفترض لو ان الرقم به  مشكلة سيحدث لديك بعض Exceptions

لدي سؤال لك هل قمت بحفظ الرقم في ملف أو في ملف sql او ماذا ...... أم لم تحفظ الرقم إطلاقا؟
الرد }}}
تم الشكر بواسطة:
#4
شكرا لك على الرد  //  و لكن تم التجربه مره اخرى و نفس النتيجة بالنسبه لي  ،،  لا اعلم عن باقي الاعضاء هل يحصل معي ام للكل  ،،  

على العموم  اخي الفاضل قمت بالخطوات كما تفضلت  ،،  و لكن خذ بالاعتبار بان الكود يعمل بشكل جيد خلال فترة تشغيل البرنامج بمجرد اغلاقي للبرنامج و استخدام الكود مره اخرى فانه لا يعمل   


قم بالضغط على Button1  و الى الان  يعمل  بعدها قم باغلاق البرنامج و تشغيله مره  اخرى  و اضغط على الزر  button2 و الذي من المفترض ان يجلب الصورة مباشرة  ،،  هنا يظهر خطأ  ما  لاع اعلم ما سببه

كود :
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim bmp As Bitmap = CType(Image.FromFile("D:\LoginBackGround.jpg"), Bitmap)
        Dim bitmapInteger As Integer = BitmapToInteger(bmp)

        PictureBox1.Image = CType(IntegerToBitmap(bitmapInteger), Bitmap)
        If WriteDataToFile(CType(Image.FromFile("D:\LoginBackGround.jpg"), Bitmap), DataFileName) Then
            MessageBox.Show("Bitmap has been saved to file")
        Else
            MessageBox.Show("Do Not know how to save bitmap to file")
        End If
    End Sub



    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        PictureBox1.Image = CType(ReadDataFromFile(DataFileName), Bitmap)
    End Sub



    Private Const DataFileName As String = ".\data.bin"

    Friend Function BitmapToInteger(ByVal bmp As Bitmap) As Integer
        Dim ptr As System.IntPtr = System.IntPtr.Zero
        Dim result As Integer = CType(Nothing, Integer)
        If bmp IsNot Nothing Then
            ptr = bmp.GetHbitmap()
        End If
        result = ptr.ToInt32
        ' OR, you may use
        'result = ptr.ToInt64
        If ptr <> IntPtr.Zero Then
            ptr = IntPtr.Zero
        End If

        Return result
    End Function

    Friend Function IntegerToBitmap(ByVal value As Integer) As Bitmap
        Return Bitmap.FromHbitmap(value)
    End Function

    Private Function WriteDataToFile(ByVal bmp As Bitmap, ByVal filename As String) As Boolean
        Dim characterEncoding As System.Text.Encoding = CType(Nothing, System.Text.Encoding)

        If characterEncoding Is Nothing Then
            Dim encoder As System.Text.Encoding = CType(System.Text.Encoding.UTF8.Clone(), System.Text.Encoding)
            encoder.EncoderFallback = System.Text.EncoderFallback.ReplacementFallback
            characterEncoding = encoder
        End If

        Using writer As New System.IO.BinaryWriter(System.IO.File.Open(filename, System.IO.FileMode.Create), characterEncoding)
            Dim i As Integer = BitmapToInteger(bmp)
            writer.Write(i)

            Return True
        End Using
        Return False
    End Function

    Private Function ReadDataFromFile(ByVal filename As String) As Bitmap
        Dim bmp As Bitmap = CType(Nothing, Bitmap)
  
      If (System.IO.File.Exists(filename)) Then
Using reader As New System.IO.BinaryReader(System.IO.File.Open(filename, System.IO.FileMode.Open), New System.Text.UTF8Encoding(False, False))
                Dim i As Integer = reader.ReadInt32
                bmp = IntegerToBitmap(i)
            End Using
        End If
        Return bmp
    End Function

End Class


      
اسم معرفي : محمد يحيى
الرد }}}
تم الشكر بواسطة:
#5
الأخ محمد يحي

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

في الكود الخاص بي ستجد أن الرقم الذي يشير الي الصورة هو في الأصل عبارة عن Pointer يشير مباشرة الي الصورة الموجودة في Resources لكن في الكود الخاص بك الأمر يختلف قليلا فهنا انت تتعامل مع ملف علي الجهاز و بالتالي تحتاج الي الحصول عليPointer يشير الي هذا الملف

الخلاصة و ما يهمني توضيحه هنا هو أنه يوجد فارق كبير بين تخزين الصورة في ملف و بين قراءة الصورة و تخزينها بهذا الاسلوب
لكن ولتخزين و حفظ الصورة بشكل فعلي ليراه المستخدم كصورة فهنا عليك ان تقوم بتحويلها الي بايت و العكس صحيح
الرد }}}
تم الشكر بواسطة: myalsailamy , myalsailamy
#6
مشكووووووووووووووووووووووووووووووووورر
(( نحن قوم أعزنا الله بالإسلام فمهما ابتغينا العزة بغيره أذلنا الله )) .. 











الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مقدمة إلي ضغط الصور ..... Zip Bitmap silverlight 0 2,392 10-05-18, 04:35 AM
آخر رد: silverlight
  Code Snippet: Convert From Ulong To Byte Array & Vice Versa silverlight 0 1,683 08-05-18, 05:15 PM
آخر رد: silverlight
  Convert structure to byteArray & viceversa silverlight 0 1,707 24-09-17, 01:51 AM
آخر رد: silverlight
  Convert Bitmap To ByteArray & ViceVersa silverlight 1 2,093 22-09-17, 03:37 PM
آخر رد: Amir_Alzubidy
  Convert Delegate to IntPtr & Viceversa silverlight 1 1,678 15-08-17, 04:54 PM
آخر رد: silverlight
  [VB.NET] عمل برنامج تحويل الفيديو video convert alking-0999 0 2,808 09-07-15, 12:50 PM
آخر رد: alking-0999
  معلومة ::: Integer - UInteger RaggiTech 1 1,774 06-10-12, 09:52 PM
آخر رد: RaggiTech

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


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