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

هل من الممكن إعادة تلوين الصورة ؟

إعادة تلوين الصورة يتم باستخدام GetPixel وأيضا SetPixel ثم تلوين الصورة بأي لون نحدده مسبقا أو عن طريق استخدام أي لون موجود بالفعل داخل الصورة وهنا يمكننا أن نطلق علي هذا الأسلوب الجزء السهل في عملية إعادة تلوين الصورة
كما يمكن أيضا استخدام ColorMatrix Class في إعادة تلوين الصورة وهذا أسلوب أخر لتغيير ألوان الصورة وسنناقشه لاحقا في المقال
ومن الأساليب التي من الممكن إتباعها أيضا وهو يتم باستخدام BitmapData Class و Bitmap Class معا وهنا علينا أن ندرس ونفهم مسميات مثل Scan0 و Stride وأيضا LockBits و UnlockBits وأيضا علينا أن نفهم كيفية التعامل مع Memory وكيفية القراءة منها والكتابة إليها عن طريق استخدام Marshal Class وهذا ما يمكن أن نطلق عليه الجزء الصعب في عملية إعادة تلوين الصورة وعلي العموم هذا الأسلوب يحتاج لمقال خاص به حتى يمكن توضيحه بشكل أفضل
ولنعطي بعض الأمثلة عن كيفية استخدام GetPixel و SetPixel في كيفية تلوين الصورة لكي يتضح الأمر للقارئ
مثال رقم 1
افتح مشروع جديد وأضف له صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي


كود :
Public Class Form1

Dim bmp As New Bitmap(My.Resources.imgsrv)

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

For x As Integer = 0 To bmp.Width - 1
For y As Integer = 0 To bmp.Height - 1
Dim bmpColor As Color = bmp.GetPixel(x, y)
Dim clr As Color = Color.FromArgb(100, Color.Blue)
bmp.SetPixel(x, y, clr)
Next
Next

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

End Sub

End Class
ستلاحظ عزيزي القارئ عند تنفيذ الكود أن الصورة قد اختفت تماما ولكنها أخذت اللون الذي حددناه وهو قيمة المتغير clr
ستلاحظ أيضا أن هناك لونان موجودان بالكود وهما المتغير bmpColor وهو يمثل مجموعة الألوان الموجودة بالصورة وأيضا المتغير clr وهو يمثل اللون الذي حددناه ثم قمنا باستخدام SetPixel لتغيير ألوان البكسل الموجودة بالصورة الي اللون الجديد
إذن ماذا نفعل لكي تظهر الصورة. لنأخذ مثالا أخر لتوضيح ذلك
مثال رقم 2
افتح مشروع جديد وأضف له صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي


كود :
Public Class Form1

Dim bmp As New Bitmap(My.Resources.imgsrv)

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

Dim clr As Color = Color.FromArgb(100, Color.Blue)

For x As Integer = 0 To bmp.Width - 1
For y As Integer = 0 To bmp.Height - 1
Dim bmpColor As Color = bmp.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(100, clr.R, bmpColor.B, clr.B)
bmp.SetPixel(x, y, newclr)
Next
Next

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

End Sub

End Class
ستلاحظ عزيزي القارئ عند تنفيذ الكود أن الصورة الأن أصبحت ظاهرة للعين ولكن ما الفارق بين الكود الموجود بالمثال رقم 1 والكود الموجود بالمثال رقم 2. الفارق أننا قمنا بتعريف لون ثالث وهو المتغير newclr حيث مكونات هذا اللون عبارة عن جزئين وهم اللون الذي حددناه وهو يمثل المتغير clr وأيضا اللون الخاص بالصورة ويمثله المتغير bmpColor
الأن حاول تجربة الأمثلة التالية ثم عليك عزيزي القارئ أن تلاحظ الفرق فيما بينهما
مثال رقم 3
افتح مشروع جديد وأضف له صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي


كود :
Public Class Form1

Dim bmp As New Bitmap(My.Resources.imgsrv)

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

For x As Integer = 0 To bmp.Width - 1
For y As Integer = 0 To bmp.Height - 1
Dim bmpColor As Color = bmp.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(0, 0, bmpColor.B)
bmp.SetPixel(x, y, newclr)
Next
Next

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

End Sub

End Class
في المثال رقم 3 أعلاه استخدمنا فقط الألوان الموجودة بالصورة حيث قمنا بإلغاء جميع الألوان الحمراء والخضراء بالصورة واسترجعنا فقط اللون الأزرق ثم استخدمناه في إعادة تلوين الصورة
مثال رقم 4
افتح مشروع جديد وأضف له صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي


كود :
Public Class Form1

Dim bmp As New Bitmap(My.Resources.imgsrv)

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

For x As Integer = 0 To bmp.Width - 1
For y As Integer = 0 To bmp.Height - 1
Dim bmpColor As Color = bmp.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(0, bmpColor.G, 0)
bmp.SetPixel(x, y, newclr)
Next
Next

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

End Sub

End Class
في المثال رقم 4 أعلاه استخدمنا فقط الألوان الموجودة بالصورة حيث قمنا بإلغاء جميع الألوان الحمراء والزرقاء بالصورة واسترجعنا فقط اللون الأخضر ثم استخدمناه في إعادة تلوين الصورة
مثال رقم 5
افتح مشروع جديد وأضف له صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي


كود :
Public Class Form1

Dim bmp As New Bitmap(My.Resources.imgsrv)

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

For x As Integer = 0 To bmp.Width - 1
For y As Integer = 0 To bmp.Height - 1
Dim bmpColor As Color = bmp.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(bmpColor.R, 0, 0)
bmp.SetPixel(x, y, newclr)
Next
Next

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

End Sub

End Class
في المثال رقم 5 أعلاه استخدمنا فقط الألوان الموجودة بالصورة حيث قمنا بإلغاء جميع الألوان الخضراء والزرقاء بالصورة واسترجعنا فقط اللون الأحمر ثم استخدمناه في إعادة تلوين الصورة
مثال رقم 6
افتح مشروع جديد وأضف له صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي



كود :
Dim bmp As New Bitmap(My.Resources.imgsrv)

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

For x As Integer = 0 To bmp.Width - 1
For y As Integer = 0 To bmp.Height - 1
Dim bmpColor As Color = bmp.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(0, bmpColor.G, bmpColor.B)
bmp.SetPixel(x, y, newclr)
Next
Next

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

End Sub

End Class
في المثال رقم 6 أعلاه استخدمنا فقط الألوان الموجودة بالصورة حيث قمنا بإلغاء اللون الأحمر فقط واسترجعنا الألوان التي مكوناتها خليط من اللونين الأزرق والأخضر حيث تم استخدامهم في إعادة تلوين الصورة
حاول أن تجعل القيمة الخاصة بالمتغير newclr تكون بالشكل التالي ستكتشف أنك لو قمت بذلك ستجد أن الصورة لم تتغير علي نهائيا


كود :
Dim newclr As Color = Color.FromArgb(bmpColor.R, bmpColor.G, bmpColor.B)
حاول أيضا أن تجعل القيمة الخاصة بالمتغير newClr تأخذ واحدا من القيم التالية الموجودة بالكود أدناه ستكتشف أن ألوان الصورة تحولت الي الأبيض والأسود مع الوضع في الاعتبار أن ألوان الصورة الأصلية ستؤثر علي كثافة اللونين الأبيض والأسود


كود :
Dim newClr As Color = Color.FromArgb(bmpColor.R, bmpColor.R, bmpColor.R)
أو الشكل التالي
Dim newClr As Color = Color.FromArgb(bmpColor.G, bmpColor.G, bmpColor.G)
أو الشكل التالي
Dim newClr As Color = Color.FromArgb(bmpColor.B, bmpColor.B, bmpColor.B)
حاول أيضا أن تجعل القيمة الخاصة بالمتغير newClr تساوي القيمة التالية الموجودة بالكود أدناه ستكتشف أن ألوان الصورة قد تم عكسها تمام


كود :
Dim clr As Color = Color.FromArgb(255, 255 - bmpColor.R, 255 - bmpColor.G, 255 - bmpColor.B)
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - الجزء الثامن - بواسطة Raggi Tech - 02-10-12, 03:23 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات ابو ليلى 5 6,004 16-08-24, 04:39 PM
آخر رد: ackore
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 8,419 19-07-22, 12:15 AM
آخر رد: StartLight4000
Video [درس فيديو] تقارير الكريستال ريبورت وتغيير مسار الصور أثناء التشغيل رمضان272 0 2,005 28-03-22, 03:18 AM
آخر رد: رمضان272
  شرح خوارزميات معالجة الصور (من دروس الاستاذ فوزي برزنجي) ناديه الشجيري 19 35,660 20-02-22, 02:13 PM
آخر رد: رضوان الجماعي
  التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة RaggiTech 3 6,376 30-07-21, 05:14 PM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع ملفات اوفيس من خلال مكتبة NPOI ابو ليلى 2 4,635 01-07-21, 11:42 AM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع اختصارات الملفات Shortcuts Magic Sword 2 4,723 01-10-20, 11:36 AM
آخر رد: abomo3ath
  [مقال] دوال التعامل مع النصوص Strings - VB.NET ابو ليلى 10 27,224 15-04-19, 07:09 PM
آخر رد: alsouf
  Compare Images المقارنة بين الصور Abu Ehab 0 3,655 31-10-18, 04:27 PM
آخر رد: Abu Ehab
  اصنع محرر أكواد خاص بك باستخدام الأداة RichTextBox السكر المغرور 13 8,228 19-08-18, 09:27 AM
آخر رد: elgokr

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


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