منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : للتحويل من Image إلى ByteArray والعكس - مع ملاحظة الطريقتين (ToArray - .GetBuffer.)
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كاتب الموضوع : عبدالله الدوسري

السلام عليكم ورحمة الله وبركاتة

شرح بسيط لبعض عمليات تحويل نوع بيانات الصور

للتحويل من نوع Image إلى نوع ByteArray

كود :
[color=blue]Public Function[/color] ConvertImageToBytes([color=blue]ByVal [/color]ImageToConvert [color=blue]As [/color]System.Drawing.Image) [color=blue]As Byte[/color]()
[color=blue]Dim [/color]MS [color=blue]As New[/color] System.IO.MemoryStream
ImageToConvert.Save(MS, Drawing.Imaging.ImageFormat.Gif
)
[color=blue]Return [/color]MS.ToArray
[color=blue]End Function[/color]
'
عكس الطريقة السابقة :
للتحويل من نوع ByteArray إلى نوع Image

كود :
[color=blue]Public Function[/color] ConvertBytesToImage([color=blue]ByVal [/color]BytesToConvert [color=blue]As Byte[/color]()) [color=blue]As [/color]System.Drawing.Image
[color=blue]Dim [/color]MS [color=blue]As New[/color] IO.MemoryStream(BytesToConvert)
[color=blue]Return [/color]System.Drawing.Image.FromStream(MS)
[color=blue]End Function[/color]
'
ملاحظة : إذا كانت الصورة على هيئة معينة ,, ولكي تحصل على تحويل صحيح من نوع Image إلى نوع ByteArray
أقصد بالتحويل الصحيح (كمية البيانات في الصورة الأصل يساوي كمية البيانات بعد التحويل)
يجب التحويل بنفس هيئة الصورة
إذا كانت الصورة الأصل على هيئة Png ( من خلال الكود اختر الهيئة Png
)
وإذا كانت الصورة الأصل على هيئة Gif ( من خلال الكود اختر الهيئة Gif
)

أو بإمكانك تمرير هيئة الصورة مع الـ Parameters



طبعاً بإمكانك التحويل من هيئة إلى هيئة أخرى , ولكن حجم بيانات الصورة سيختلف على حسب الهيئة التي إخترتها.
ملاحظة :
التحويل من هيئة إلى أخرى من الممكن أن يقلل من جودة الصورة
على سبيل المثال (من Png إلى Gif) حجم الصورة سيقل وكذلك الجودة
والعكس غير صحيح :
لا تزيد الجودة عند التحويل ( من Gif إلى Png ) ولكن حجم الصورة سيزيد




ملاحظة :
يفضل إستخدام الطريقة ToArray. بدلاً من الطريقة GetBuffer. ـ


ملاحظة :
الطريقة ToArray.
(لو كان الـ MemoryStream يحمل القيمة النصية "test" )
فأن الطريقة ToArray. ستعود بـ 4 bytes فقط .
وهو عدد الـ bytes المستخدم فعلياً من قبل الـ MemoryStream


الطريقة GetBuffer.
(لو كان الـ MemoryStream يحمل القيمة النصية "test" )
فأن الطريقة GetBuffer. ستعود بـ 256 bytes وليس 4 bytes (كما هو مفترض من النص "test" الموجود بداخلها) والذي عدد حروفة 4 )
طول المصفوفة الناتج من هذة الطريقة 256 bytes ـ
4 bytes (متسخدمين) أي 4 bytes غير فارغة
252 bytes (غير مستخدمين) أي 252 bytes فارغة
---هذة الطريقة تحتاج أن تكون على علم بعدد الـ bytes التي تحتاجها ,, (فقط إذا كانت أقل من 256 bytes ) إذا كانت أكبر فستعود بنفس عدد البيانات الموجودة في الـ MemoryStream
لأن الناتج من هذة الطريقة من الممكن أن يحتوي على زيادة في عدد الـ bytes الغير مستخدمة في المصفوفة) (فقط إذا كانت أقل من 256 bytes )
إذا كانت أكبر فلن تكون هناك زيادة في عدد الـ bytes الغير مستخدمة في المصفوفة



مثلا :
لو لديك MemoryStream يحمل قيمة نصية عدد حروفها 300 حرف (أكبر من 256 bytes)
الناتج من الطريقة GetBuffer. سيكون 300 bytes لأنها أكثر من 256 (أي ستعود بنفس العدد)
لأن القيمة النصية أكبر من الحد الأدنى وهو 256

لو لديك MemoryStream يحمل قيمة نصية عدد حروفها 100 حرف (أقل من 256 bytes)
الناتج من الطريقة GetBuffer. سيكون 256 bytes لأن 100 أقل من 256 (أي ستعود بالحد الأدنى)
لأن القيمة النصية أقل من الحد الأدنى وهو 256

المهم
إذا كانت البيانات المراد تحويلها إلى bytes حجمها أقل من 256 الناتج سيكون 256
حتى لو كان حجم البيانات 1 Byte ستعود بحجم 256 Bytes

إذا كانت البيانات المراد تحويلها إلى bytes حجمها أكبر من أو = 256 الناتج سيكون نفس حجم البيانات المراد تحويلها


Base64ToImage
للتحويل من نص إلى صورة :

كود :
Public Function Base64ToImage(ByVal base64String As String) As System.Drawing.Image
' Convert Base64 String to byte[]
Dim imageBytes As Byte() = Convert.FromBase64String(base64String)
Dim ms As New IO.MemoryStream(imageBytes, 0, imageBytes.Length)

' Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length)
Dim img As Drawing.Image = Drawing.Image.FromStream(ms, True)
Return img
End Function
'


ImageToBase64
للتحويل من صورة إلى نص :

كود :
Public Function ImageToBase64(ByVal image As System.Drawing.Image) As String
Using ms As New IO.MemoryStream()
' Convert Image to byte[]
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png)
Dim imageBytes As Byte() = ms.ToArray()

' Convert byte[] to Base64 String
Dim base64String As String = Convert.ToBase64String(imageBytes)
Return base64String
End Using
End Function
'





المشروع في المرفقات موضح بشكل أفضل :


تحياتي للجميع