بسم الله الرحمن الرحيم
هذا درس رائع للتعلم كيفية حفظ نص - صورة في نفس الملف
مثل برنامج Acrobat Reader يقوم بفتح ملفات PDF التحي تحتوي
على صورة ونصوص .... فهل تريد أن يصبح لك تنسيق خاص بك ؟!!
الخطوة الأولى : كيف نقوم بتنظيم البيانات للكتابة
- يجب علينا أن نقوم بصنع جدوال (Structures)للتنظيمم والجدول التي ستلزمنا
الجدوال الأول
Structure ImageType Dim img As Byte() Dim AnyText() As String End Structure
وهو لحفظ مجموعة صورة مع نص خاص بكل واحدة لكن أنتبه !
المتغير img هو المسؤول عن تخزين الصور لكنه ليس من النوع image
بل من النوع Byte !!! لماذا ؟
لأنه طريقة الكتابة إلى الملف لا تدعم النوع image لذا يجب تحويل الصور
إلى byte قبل
الجدول الثاني
Structure TextType Dim Text As String End Structure
هذا الجدول مسؤول عن حفظ النصوص
الجدول TypeToWrite
Structure TypeToWrite Dim Images() As ImageType Dim Texts() As TextType End Structure
كما تلاحظ هو عبارة عن مصفوفات من الجدولين ImageType و TextType
وهو يتم تجهيزه في الاخر للكتابة
الأن أنتهينا من الجداول والأن عبارة عن دالة لكتابة الجدول TypeToWrite إلى ملف
Public Sub WrtieToFile(ByVal FileName As String, ByVal Data As TypeToWrite) Dim i As Integer = FreeFile() Try FileOpen(i, FileName, OpenMode.Binary) FilePut(i, Data) FileClose(i) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical) End Try End Sub
------------------------------- الكتابة -------------------------------
والأن سنبدأ في طريقة تجهيز الجداول للكتابة :
الدالة : CreateMyFile
Public Sub CreateMyFile(ByVal im As Image, ByVal Strings As String, ByVal FileName As String)
Try
Dim MemoStream As New IO.MemoryStream
im.Save(MemoStream, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim Arr() As Byte = MemoStream.ToArray
Dim img As New ImageType
img.img = Arr
img.AnyText = "Your Tag"
Dim T As New TextType
T.Text = Strings
Dim AllData As New TypeToWrite
Dim ImgTypes() As ImageType = {img}
Dim St() As TextType = {T}
AllData.Images = ImgTypes
AllData.Texts = St
WrtieToFile(FileName, AllData)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Try
End Subهذا الدالة تستقبل ثلاثة بارمترات وهي :
im - وهو الصورة المراد وضعها في الملف
strings - وهو النصوص المراد وضعها في الملف
FileName - وهو أسم الملف المراد الكتابة إليه
طريقة العمل :
أولا - كما ذكرنا سابقا فإن الجدول ImageType لا يقبل الصور إلى بعد تحويلها إلى Bytes وطريقة تحويلها
عن طريقة IO.MemoryStream
ثانيا شرح الدالة :في السطر الأول قمنا بتعريف متغير من النوع IO.MemoryStream لتحويل الصورة الممررة إلى Byte()
السطر الثاني لحفظ الصورة داخل ل MemoStream الأن أصبحت الصورة داخل MemoStream على شكل Byte() وهو المطلوب
وفي السطر الثالث نقوم بأخذها وأصبحت لدينا الأن الصورة على شكل Byte()
السطر الرابع نقوم ببدأ استعمال الجداول التي قمنا بعملها ونبدأ مع ImageType ونعرف متغير أسمه img
في السطر الخامس والسادس نقوم يتهيئة المتغيرات الخاصة بالمتغير img
في السطر السابع نقوم ببدء أستعمال الجدول TextType وفي الثامن نقوم بتهيئة متغيراته
في السطر التاسع نقوم بإستخدام الجدول TypeToWrite
طبعا هنا لم نسمح إلا بوضع صورة واحدة في الملف ويمكن تعديلها
الأن السطرالعاشر والحادي عشر نقوم بتعريف مصفوفات من الجداول imageType و TextType لأن
الجدوال TypeTowrite لا يقبل إلا مصفوفات لكي يتسنى وضع أكثر من جدوال
في السطرين 13 و 14 نقوم بتهيئة المتغير AllData
وفي السطر السادس عشر نكون قد جهزنا بيانات الملف ونستخدم الدالة WriteToFile التي قمنا بصنعها لكتابة
البيانات إليه
وهكذا نكون قد أنتهينا من طريق الكتابة والأن كيف سنقوم بقراءة الملف الذي قمنا بصنعه
------------------------------- القراءة -------------------------------
الكود هو :
Dim ImgType() As ImageType - 1
Dim TextTyp() As TextType - 2
Dim AllDat As New TypeToWrite - 3
Dim i As Integer = FreeFile() -4
Dim Fi As String - 5
Dim a As New OpenFileDialog -6
a.Filter = "MiCcSoft Test Files (*.tst)|*.tst" - 7
If a.ShowDialog = Windows.Forms.DialogResult.OK Then -8
Fi = a.FileName -9
Else -10
MsgBox("لم تقم بتحديد ملف", MsgBoxStyle.Critical) -11
Exit Sub - 12
End If - 13
FileOpen(i, Fi, OpenMode.Binary)-14
FileGet(i, AllDat) - 15
FileClose(i) - 16
ImgType = AllDat.Images - 17
TextTyp = AllDat.Texts - 18
Dim MemoStr As New IO.MemoryStream - 19
Dim Bi As New IO.BinaryWriter(MemoStr) - 20
Bi.Write(ImgType(0).img, 0, ImgType(0).img.Length) - 21
Bi.Flush() -22
pic.Image = Image.FromStream(MemoStr - 23
24 -textD.Text = TextTyp(0).Textالشرح :الأسطر الأول و الثاني و الثالث نقوم بتعريف الجداول لتعبأتها عند فتح الملف الهدف
الأسطر من 4 حتى 13 خي للأستعراض عن ملف
السطر 14 نقوم بفتح الملف الهدف
السطر 15 نقوم بملئ المتغير AllData الذي قمنا بتعريفه في السطر الثالث وهو من النوع TypeToWrite أي جدول
السطر 16 نقوم بإغلاق الملف بعد قراءته
السطرين 17 و 18 نقوم بملئ المتغيرين ImgType و TextTyp الذين قمنا بتعريفهما في السطرين الأول والثاني
الأن كما تذكر سابقا حولنا من image إلى Byte() عن طريق IO.MemoryStream ولعكس التحويل أي من Byte()
إلى image يجب أستخدام IO.MemoryStream
في السطر 19 قمنا بتعريف متغير من النوع IO.MemoryStream
الأن كيف سنقوم بكتابة ل Byte() إلى المتغير MemoStr
عن طريق IO.BinaryWriter
في السطر 20 قمنا يتعريف متغير من النوع IO.BinaryWriter وجعلنا البرامتر الخاص به هو MemoStr
السطر 21 نقوم بكتابة Byte() إلى MemoStr
السطر 22 نقوم بإنهاء ل الكتابة
وباقي الأسطر لإظهار النتائج
وهنا نكون قد أنتهينا وقد قمت بإرفاق مثال على هذا الدرس
تم بعون الله