تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة
#1
كاتب الموضوع : silverlight

التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI
اللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2005 و 2008
المستوي: التقييم متروك للقارئ
إعداد: مهندس / عمر أمين إبراهيم

مقدمة
التعامل مع الصور في الدوت نت شئ هام جدا لأنه غالبا ما نحتاج إلي إضافة الصور الي برامجنا بشكل ما فأنت إن حاولت أن تصف شخص ما علي سبيل المثال فستحتاج الي كتابة الكثير من الكلمات لتوضح كيف يبدو هذا الشخص لكنك لو قمت بعرض صورته مباشرة فستوفر علي نفسك الكثير من الجهد والوقت لذلك فإن المقولة الشهيرة أن الصورة تساوي ألف كلمة صحيحة مائة بالمائة.
في واقع الأمر الهدف من هذا المقال هو ليس فقط أن نتعلم كيفية التعامل مع الصور و هنا كلمة التعامل مع الصور في بيئة الدوت النت لن تكون قاصرة علي كيفية عرض الصور في الفورم فقط بل أيضا الهدف منها هو أن نتعلم كيفية التعديل بهذه الصور كما نريد عن طرق إضافة مؤثرات خاصة لهذه الصور وذلك باستخدام +GDI
وبشكل عام فإن الهدف النهائي أو الهدف الأكبر من المقال سيكون عبارة عن بناء كلاس و سوف نقوم بتحويل هذا الكلاس الي ملف DLL حيث يمكن أن نستخدمه داخل أي برنامج نصممه وبالتالي يمكننا عندها أن نتعامل مع الصور بأي شكل نريده بدون الحاجة الي كتابة الكود أو تكرار الكود أكثر من مرة وأيضا نجعل استخدام الكود أكثر سهولة وأكثر متعة وأكثر كفاءة بشكل عام
عموما سوف نناقش كيفية التعامل مع الصور وعند الانتهاء من كل جزء في المقال سنحاول أن نخرج بدالة Function ثم نقوم بتجميع كل هذه الدوال في نهاية المقال لنبني بها الكلاس الذي من الممكن أن نستخدمه في التعامل مع الصور ثم نحوله الي ملف DLL ثم نناقش كيفية استخدامه داخل أي برنامج نريده ولنتحدث قليلا عن كيفية بناء الصورة
يوجد في الدوت نت كلاس اسمه Bitmap Class وهو كلاس معروف للجميع هذا الكلاس يسمح لنا بتعريف و بناء أي صورة نريدها وذلك عن طريق تعريف متغير قيمته تساوي Bitmap حيث يمكننا هنا إما أن نساوي قيمة هذا المتغير بصورة ما علي جهاز الكمبيوتر لدينا أو يمكننا أن رسم صورة بالكامل من الصفر أو أن بناء صورة جديدة من صورة أو أكثر ثم نرسم ما نريد بداخلها ثم نستخدم هذه الصورة الجديدة كما نريد
مجموعة الأكواد التالية توضح بعض الأفكار لكيفية تعريف وبناء الصورة


كود :
Dim bmp As Bitmap
Dim bmp1 As Bitmap = Nothing
Dim bmp2 As New Bitmap("C:\myImage.bmp")
Dim bmp3 As Bitmap = New Bitmap("C:\myImage.bmp", True)
Dim bmp4 As Bitmap = New Bitmap("C:\myImage.bmp", False)
Dim bmp5 As Bitmap = New Bitmap("C:\myImage.bmp")
Dim bmp6 As New Bitmap(My.Resources.blender)
Dim bmp7 As New Bitmap(PictureBox1.image)
Dim bmp8 As New Bitmap(Form2.BackgroundImage)
Dim bmp9 As New Bitmap(Me.BackgroundImage)
Dim bmp10 As New Bitmap(150, 150, Imaging.PixelFormat.Format32bppPArgb)
Dim bmp11 As New Bitmap(100, 100)
وأيضا يوجد في الدوت نت كلاس اسمه Graphics Class وهو الكلاس المسئول عن الرسم بشكل عام إما داخل صورة أو داخل الفورم أو داخل أي كونترول أو حتى يمكن استخدامه في تغيير شكل الفورم أو الكونترول
ولو قمت عزيزي القارئ باستخدام الكلاسان معا أي Graphics Class مع Bitmap Class يمكنك حينها أن ترسم ما تريد
والكود التالي يوضح كيفية تعريف Graphics Class من صورة ما


كود :
Dim g As Graphics = Graphics.FromImage(bmp)
والمثال التالي يوضح كيفية إنشاء الصورة ثم الرسم داخلها بأكثر من طريقة وأنت يمكنك أن تفعل نفس الشئ وترسم ما تريد داخل الصورة ومن ثم تقوم باستخدامها كما تريد والأمر متروك لخيالك وإبداعك حيث ستلاحظ أنه يتم تعريف الصورة ثم يتم تعريف Graphics باستخدام الصورة ثم نرسم ما نريد بعد ذلك ويجب أن تلاحظ عزيزي القارئ في الكود التالي أن مجموعة الصور تلك يتم رسمها أولا في Memory ثم بعد ذلك يتم تنفيذ باق الكود حيث يتم عرض الصور داخل مجموعة من PictureBox Control كمثال فقط
ولتنفيذ المثال افتح مشروع وأضف الي الفورم 6 PictureBox ثم اكتب الكود بالشكل التالي


كود :
Public Class Form1

Dim img As New Bitmap(My.Resources.blender)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

CreateImage()
CreateImage1()
CreateImage2()
CreateImage3()
CreateImage4()
CreateImage5()

End Sub

Private Sub CreateImage()

Dim bmp As New Bitmap(150, 150, Imaging.PixelFormat.Format32bppPArgb)
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillRectangle(Brushes.Black, rect)

Dim lgb As New Drawing2D.LinearGradientBrush(rect, Color.Blue, Color.BlueViolet, Drawing2D.LinearGradientMode.Vertical, True)
Dim rect1 As New Rectangle(rect.X + 4, rect.Y + 4, rect.Width - 8, rect.Height - 8)
g.FillRectangle(lgb, rect1)

Dim rect2 As New Rectangle(rect1.X + 8, rect1.Y + 8, rect1.Width - 16, rect1.Height - 16)
Dim lgb1 As New Drawing2D.LinearGradientBrush(rect1, Color.Lime, Color.Green, Drawing2D.LinearGradientMode.Vertical, True)
g.FillRectangle(lgb1, rect2)

Dim rect3 As New Rectangle(rect2.X + 8, rect2.Y + 8, rect2.Width - 16, rect2.Height - 16)

rect3.Inflate(-1, -1)
g.FillRectangle(New SolidBrush(Color.FromArgb(25, Color.Black)), rect3)
g.DrawString("Photo", New Font("Times New Roman", 14), Brushes.White, 0, 0)

PictureBox1.Image = bmp
PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage

End Sub

Private Sub CreateImage1()

Dim bmp As New Bitmap(150, 150, Imaging.PixelFormat.Format32bppPArgb)
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillRectangle(Brushes.Black, rect)

Dim lgb As New Drawing2D.LinearGradientBrush(rect, Color.Blue, Color.BlueViolet, Drawing2D.LinearGradientMode.Vertical, True)
Dim rect1 As New Rectangle(rect.X + 4, rect.Y + 4, rect.Width - 8, rect.Height - 8)
g.FillRectangle(lgb, rect1)

Dim rect2 As New Rectangle(rect1.X + 8, rect1.Y + 8, rect1.Width - 16, rect1.Height - 16)
Dim lgb1 As New Drawing2D.LinearGradientBrush(rect1, Color.Lime, Color.Green, Drawing2D.LinearGradientMode.Vertical, True)
g.FillRectangle(lgb1, rect2)

Dim rect3 As New Rectangle(rect2.X + 8, rect2.Y + 8, rect2.Width - 16, rect2.Height - 16)

rect3.Inflate(-1, -1)
g.FillRectangle(New SolidBrush(Color.FromArgb(25, Color.Black)), rect3)

Dim clr As Color = img.GetPixel(img.Width / 2, img.Height / 2)
Dim sb As New SolidBrush(Color.FromArgb(75, Color.Navy))

g.FillRectangle(sb, New Rectangle(rect3.X + 8, rect3.X + 8, rect3.Width - 16, rect3.Height - 16))

g.DrawImage(img, New Rectangle(rect3.X + 8, rect3.X + 8, rect3.Width - 16, rect3.Height - 16))

g.FillEllipse(sb, New Rectangle(rect3.X + 16, rect3.X + 16, rect3.Width - 32, rect3.Height - 32))

g.DrawString("Photo", New Font("Times New Roman", 14), Brushes.White, 0, 0)
PictureBox2.Image = bmp
PictureBox2.SizeMode = PictureBoxSizeMode.CenterImage

End Sub

Private Sub CreateImage2()

Dim bmp As New Bitmap(150, 150, Imaging.PixelFormat.Format32bppPArgb)
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillRectangle(New SolidBrush(Color.FromArgb(150, Color.Black)), rect)

For x As Integer = 0 To bmp.Width - 1 Step 10

For y As Integer = 0 To bmp.Height - 1 Step 10

Dim rect1 As New Rectangle(rect.X + x, rect.Y + y, rect.Width - 2 * x, rect.Height - 2 * y)
Dim clr As Color = Color.DarkOrange
Dim Clr1 As Color = Color.FromArgb(x, clr)

g.DrawImage(img, New Rectangle(rect.X + 8, rect.X + 8, rect.Width - 16, rect.Height - 16))

g.FillRectangle(New SolidBrush(Clr1), rect1)
g.DrawRectangle(New Pen(Color.FromArgb(100, Color.Red), 1), rect1)

Next
Next

g.FillRectangle(New SolidBrush(Color.FromArgb(50, Color.Lime)), New Rectangle(rect.X + 10, rect.Y + 10, rect.Width - 20, rect.Height - 20))

g.DrawString("Photo", New Font("Times New Roman", 14), Brushes.White, 0, 0)
g.FillRectangle(New SolidBrush(Color.FromArgb(100, Color.Gold)), rect)

PictureBox3.Image = bmp
PictureBox3.SizeMode = PictureBoxSizeMode.CenterImage

End Sub

Private Sub CreateImage3()

Dim bmp As New Bitmap(150, 150, Imaging.PixelFormat.Format32bppPArgb)
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillRectangle(New SolidBrush(Color.FromArgb(150, Color.Black)), rect)

For x As Integer = 0 To bmp.Width - 1

For y As Integer = 0 To bmp.Height - 1

Dim rect1 As New Rectangle(rect.X + x, rect.Y + y, rect.Width - 2 * x, rect.Height - 2 * y)

Dim clr As Color = Color.Chocolate
Dim Clr1 As Color = Color.FromArgb(x, clr)

g.DrawImage(img, New Rectangle(rect.X + 50, rect.X + 50, rect.Width - 100, rect.Height - 100))
g.FillRectangle(New SolidBrush(Clr1), rect1)
g.DrawRectangle(New Pen(Color.FromArgb(100, Color.Maroon)), rect1)


Next
Next


g.FillRectangle(New SolidBrush(Color.FromArgb(50, Color.Orange)), New Rectangle(rect.X + 10, rect.Y + 10, rect.Width - 20, rect.Height - 20))

g.DrawString("Photo", New Font("Times New Roman", 14), Brushes.White, 0, 0)
PictureBox4.Image = bmp
PictureBox4.SizeMode = PictureBoxSizeMode.CenterImage

End Sub

Private Sub CreateImage4()

Dim bmp As New Bitmap(150, 150, Imaging.PixelFormat.Format32bppPArgb)
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillRectangle(New SolidBrush(Color.FromArgb(20, Color.Black)), rect)


Dim textures As New Drawing2D.HatchBrush(Drawing2D.HatchStyle.BackwardDiagonal, Color.AliceBlue, Color.Tan)

g.FillRectangle(textures, New Rectangle(rect.X + 50, rect.X + 50, rect.Width - 100, rect.Height - 100))

g.DrawImage(img, New Rectangle(rect.X + 50, rect.X + 50, rect.Width - 100, rect.Height - 100))

g.FillRectangle(New Drawing2D.LinearGradientBrush(New Rectangle(rect.X + 10, rect.Y + 10, rect.Width - 20, rect.Height - 20), Color.FromArgb(250, Color.Turquoise), Color.FromArgb(150, Color.Blue), 45, False), New Rectangle(rect.X + 10, rect.Y + 10, rect.Width - 20, rect.Height - 20))

g.DrawString("Photo", New Font("Times New Roman", 14), Brushes.White, 0, 0)
PictureBox5.Image = bmp
PictureBox5.SizeMode = PictureBoxSizeMode.CenterImage

End Sub

Private Sub CreateImage5()

Dim bmp As New Bitmap(150, 150, Imaging.PixelFormat.Format32bppPArgb)
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim g As Graphics = Graphics.FromImage(bmp)

Dim textures As New Drawing2D.HatchBrush(Drawing2D.HatchStyle.SmallGrid, Color.Red, Color.FromArgb(50, Color.Red))
g.FillRectangle(textures, rect)

g.DrawImage(img, rect)

g.DrawString("Photo", New Font("Times New Roman", 14), Brushes.White, 0, 0)
PictureBox6.Image = bmp
PictureBox6.SizeMode = PictureBoxSizeMode.CenterImage

End Sub

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



بالتوفيق

أخوكم عمر
الرد }}}
تم الشكر بواسطة: Mostafa Saad
#2
المقدمة
http://vb4arb.com/vb/showthread.php?842


الجزء الأول
http://vb4arb.com/vb/showthread.php?829


الجزء الثاني
http://vb4arb.com/vb/showthread.php?830


الجزء الثالث
http://vb4arb.com/vb/showthread.php?832


الجزء الرابع
http://vb4arb.com/vb/showthread.php?833


الجزء الخامس
http://vb4arb.com/vb/showthread.php?834


الجزء السادس
http://vb4arb.com/vb/showthread.php?835


الجزء السابع
http://vb4arb.com/vb/showthread.php?836


الجزء الثامن
http://vb4arb.com/vb/showthread.php?837


الجزء التاسع
http://vb4arb.com/vb/showthread.php?839


الجزء العاشر
http://vb4arb.com/vb/showthread.php?840


الجزء الحادي عشر
http://vb4arb.com/vb/showthread.php?841
الرد }}}
تم الشكر بواسطة:
#3
(02-10-12, 03:29 PM)RaggiTech كتب :
كاتب الموضوع : silverlight

التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI 

السلام عليكم
اخي العزيز هل يمكنك مساعدتي في تقسيم الصورة الى شبكة؟
اي ان المستخدم يضغط على زر لتحميل صورة من الكومبيوتر (هذا الكود قمت بتنفيذه)
بمجرد ان يختار صورة معينة يتم عرضها في picbox (الى هنا الحمدلله نفذت الكود) 
الصورة تعرض على شكل شبكة تتكون من مجموعة خلايا وكل خلية يتم اعطاءها اسم افتراضي كما ان المستخدم يمكنه ان يختار خلايا معينة من نفس الصورة التي عُرضت كشبكة
من ثم يتم تخزين اسم الصورة + اسم الخلايا التي قام بإختيارها المستخدم في textbox
اتمنى ان تستطيع مساعدتي
ولك جزيل الشكر
الرد }}}
تم الشكر بواسطة:
#4
(02-10-12, 03:32 PM)RaggiTech كتب : المقدمة
http://vb4arb.com/vb/showthread.php?842


الجزء الأول
http://vb4arb.com/vb/showthread.php?829


الجزء الثاني
http://vb4arb.com/vb/showthread.php?830


الجزء الثالث
http://vb4arb.com/vb/showthread.php?832


الجزء الرابع
http://vb4arb.com/vb/showthread.php?833


الجزء الخامس
http://vb4arb.com/vb/showthread.php?834


الجزء السادس
http://vb4arb.com/vb/showthread.php?835


الجزء السابع
http://vb4arb.com/vb/showthread.php?836


الجزء الثامن
http://vb4arb.com/vb/showthread.php?837


الجزء التاسع
http://vb4arb.com/vb/showthread.php?839


الجزء العاشر
http://vb4arb.com/vb/showthread.php?840


الجزء الحادي عشر
http://vb4arb.com/vb/showthread.php?841

السلام عليكم
رجاء رفع هذه الدروس من جديد لتعم الفائدة فهذه الروابط لم تعد تعمل


    Heart ربي زدني علما  Heart

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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات ابو ليلى 4 4,868 08-09-22, 11:54 AM
آخر رد: saif2023
  مقدمة الي تشفير الحروف الأبجدية العربية silverlight 3 9,485 17-05-22, 02:23 AM
آخر رد: flawer69
Video [درس فيديو] تقارير الكريستال ريبورت وتغيير مسار الصور أثناء التشغيل رمضان272 0 1,603 28-03-22, 03:18 AM
آخر رد: رمضان272
  شرح خوارزميات معالجة الصور (من دروس الاستاذ فوزي برزنجي) ناديه الشجيري 19 34,315 20-02-22, 02:13 PM
آخر رد: رضوان الجماعي
Lightbulb [مقال] التعامل مع ملفات اوفيس من خلال مكتبة NPOI ابو ليلى 2 4,186 01-07-21, 11:42 AM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع اختصارات الملفات Shortcuts Magic Sword 2 4,411 01-10-20, 11:36 AM
آخر رد: abomo3ath
  [مقال] دوال التعامل مع النصوص Strings - VB.NET ابو ليلى 10 25,031 15-04-19, 07:09 PM
آخر رد: alsouf
  Compare Images المقارنة بين الصور Abu Ehab 0 3,263 31-10-18, 04:27 PM
آخر رد: Abu Ehab
  اصنع محرر أكواد خاص بك باستخدام الأداة RichTextBox السكر المغرور 13 7,501 19-08-18, 09:27 AM
آخر رد: elgokr
Exclamation [VB.NET] التعامل مع ال CMD عن طريق ال TextBox YousefOkasha 5 5,000 02-06-18, 09:34 PM
آخر رد: YousefOkasha

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


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