تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
للتحويل من Image إلى ByteArray والعكس - مع ملاحظة الطريقتين (ToArray - .GetBuffer.)
#1
كاتب الموضوع : عبدالله الدوسري

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

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

للتحويل من نوع 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
'





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


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


الملفات المرفقة
.rar   WindowsApplication1.rar (الحجم : 216.24 ك ب / التحميلات : 252)
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [VB.NET] ارجو المساعدة : How to Split an Image into Chunks amna jamal 2 2,156 23-01-18, 05:05 AM
آخر رد: silverlight
  Convert structure to byteArray & viceversa silverlight 0 1,705 24-09-17, 01:51 AM
آخر رد: silverlight
  Convert Bitmap To ByteArray & ViceVersa silverlight 1 2,091 22-09-17, 03:37 PM
آخر رد: Amir_Alzubidy
  مقارنة صورتين و الحصول علي الفرق بينهم Comparing Two Images and Get Diff Image silverlight 0 4,885 30-06-17, 11:33 AM
آخر رد: silverlight
  التحويل من C# to VB والعكس بأداتين من مايكروسوفت أبو عمر 11 7,442 03-11-15, 12:52 AM
آخر رد: أبو عمر
  Create, Save Tiff Image & Extract Images From TIFF Image silverlight 0 2,621 09-10-15, 01:40 PM
آخر رد: silverlight
Lightbulb [C#.NET] برنامج Instant للتحويل من #C إلى .Net السندبااد 4 4,154 18-10-14, 03:45 PM
آخر رد: shwehdi4pc
  [مقال] Check the file format of an Image silverlight 3 3,375 28-05-14, 05:02 PM
آخر رد: Sajad
  مقال- أفكار في الدوت نت Image To ColorPicker RaggiTech 3 2,849 05-10-12, 06:48 PM
آخر رد: RaggiTech
  ملاحظة سريعة - تمكين برنامجك من استخدام صلاحيات مدير على فيستا RaggiTech 0 2,719 05-10-12, 01:31 AM
آخر رد: RaggiTech

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


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