02-10-12, 03:23 PM
إعادة تلوين الصورة يتم باستخدام 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ستلاحظ أيضا أن هناك لونان موجودان بالكود وهما المتغير 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الأن حاول تجربة الأمثلة التالية ثم عليك عزيزي القارئ أن تلاحظ الفرق فيما بينهما
مثال رقم 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مثال رقم 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مثال رقم 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مثال رقم 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حاول أن تجعل القيمة الخاصة بالمتغير newclr تكون بالشكل التالي ستكتشف أنك لو قمت بذلك ستجد أن الصورة لم تتغير علي نهائيا
كود :
Dim newclr As Color = Color.FromArgb(bmpColor.R, bmpColor.G, bmpColor.B)كود :
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)كود :
Dim clr As Color = Color.FromArgb(255, 255 - bmpColor.R, 255 - bmpColor.G, 255 - bmpColor.B)