02-10-12, 03:27 PM
كاتب الموضوع : silverlight
التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI اللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2005 و 2008
المستوي: التقييم متروك للقارئ
إعداد: مهندس / عمر أمين إبراهيم
الجزء الحادي عشر: رسم صورة شفافة Image Transparency
أعتقد بعد مناقشتنا الألوان في الصورة في الجزء الثامن من المقال قد أصبح ممكن أن نتلاعب قليلا بشفافية الصورة وبالطبع سوف نستخدم نفس الأسلوب الذي اتبعناه بالجزء الثامن وهو استخدام GetPixel و SetPixel ثم نقوم بتغيير درجة شفافية كل لون موجود بالصورة ولنعطي مثالا علي كيفية تنفيذ ذلك ولتنفيذ المثال افتح مشروع جديد ثم قم بتعريف صورة وأضف للفورم PictureBox ثم اكتب الكود بالشكل التالي
كود :
Public Class Form1
Dim bmp As New Bitmap(My.Resources.imgsrv)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.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(50, bmpColor.R, bmpColor.G, bmpColor.B)
bmp.SetPixel(x, y, newclr)
Next
Next
PictureBox1.Image = bmp
PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage
End Sub
End Class
وكالمعتاد لنبني دالة أو مجموعة من الدوال من الكود أعلاه والكود التالي يوضح أشكال مختلفة لنفس الدالة
كود :
Public Shared Function SetImageTransparency(ByVal bitmap As Bitmap, ByVal Alpha As Integer) As Bitmap
If Alpha < 50 OrElse Alpha > 255 Then
Throw New ArgumentOutOfRangeException("Alpha must be between 50 and 255.")
End If
For x As Integer = 0 To bitmap.Width - 1
For y As Integer = 0 To bitmap.Height - 1
Dim bmpColor As Color = bitmap.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(Alpha, bmpColor.R, bmpColor.G, bmpColor.B)
bitmap.SetPixel(x, y, newclr)
Next
Next
Dim bmp As New Bitmap(bitmap.Width, bitmap.Height, bitmap.PixelFormat)
Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bitmap, 0, 0)
Return bmp
End Function
Public Shared Function SetImageTransparency(ByVal bitmap As Bitmap, ByVal Alpha As Integer, ByVal Transparent As Boolean) As Bitmap
If Alpha < 50 OrElse Alpha > 255 Then
Throw New ArgumentOutOfRangeException("Alpha must be between 50 and 255.")
End If
If Transparent Then
For x As Integer = 0 To bitmap.Width - 1
For y As Integer = 0 To bitmap.Height - 1
Dim bmpColor As Color = bitmap.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(Alpha, bmpColor.R, bmpColor.G, bmpColor.B)
bitmap.SetPixel(x, y, newclr)
Next
Next
Else
For x As Integer = 0 To bitmap.Width - 1
For y As Integer = 0 To bitmap.Height - 1
Dim bmpColor As Color = bitmap.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(bmpColor.R, bmpColor.R, bmpColor.R)
bitmap.SetPixel(x, y, newclr)
Next
Next
End If
Dim bmp As New Bitmap(bitmap.Width, bitmap.Height, bitmap.PixelFormat)
Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bitmap, 0, 0)
Return bmp
End Function
من المؤكد أننا نستطيع أن نستخدم الدوال السابقة مع بعضها البعض لإنتاج إما دوال أخري أكثر كفاءة بل أيضا يمكننا أن نستخدم الدوال السابقة إما بشكل منفرد أو من داخل بعضها البعض وذلك لهدف ما نريده ولسوف أعطي مثالا علي ذلك ولكن أولا لتعطي مثالا علي كيفية استخدام إحدي الدوال التي بنيناها أعلاه وهي الدوال الخاصة بتعديل شفافية الصورة ولتنفيذ المثال افتح مشروع جديد وقم بتعريف صورة ثم أضف PictureBox للفورم ثم اكتب الكود بالشكل التالي
كود :
Public Class Form1
Dim bmp As New Bitmap(My.Resources.imgsrv)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
PictureBox1.Image = SetImageTransparency(bmp, 50)
PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage
End Sub
Public Shared Function SetImageTransparency(ByVal bitmap As Bitmap, ByVal Alpha As Integer) As Bitmap
If Alpha < 50 OrElse Alpha > 255 Then
Throw New ArgumentOutOfRangeException("Alpha must be between 50 and 255.")
End If
For x As Integer = 0 To bitmap.Width - 1
For y As Integer = 0 To bitmap.Height - 1
Dim bmpColor As Color = bitmap.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(Alpha, bmpColor.R, bmpColor.G, bmpColor.B)
bitmap.SetPixel(x, y, newclr)
Next
Next
Dim bmp As New Bitmap(bitmap.Width, bitmap.Height, bitmap.PixelFormat)
Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bitmap, 0, 0)
Return bmp
End Function
End Class
ولتنفيذ المثال عليك أن تفتح مشروع جديد ثم قم بتعريف صورة ما ثم أضف الي الفورم PictureBox حيث سنستخدمه لعرض الصورة بعد تعديلها ثم اكتب الكود بالشكل التالي وحاول ان تجرب بنفسك استخدام أكثر من دالة معا أو اصنع دالة جديدة من هذه الدوال كلها مجتمعة
كود :
Public Class Form1
Dim bmp As New Bitmap(My.Resources.imgsrv)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim bmp1 As Bitmap = TurnImageToGray(bmp)
PictureBox1.Image = SetImageTransparency(bmp1, 50)
PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage
End Sub
Public Shared Function SetImageTransparency(ByVal bitmap As Bitmap, ByVal Alpha As Integer) As Bitmap
If Alpha < 50 OrElse Alpha > 255 Then
Throw New ArgumentOutOfRangeException("Alpha must be between 50 and 255.")
End If
For x As Integer = 0 To bitmap.Width - 1
For y As Integer = 0 To bitmap.Height - 1
Dim bmpColor As Color = bitmap.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(Alpha, bmpColor.R, bmpColor.G, bmpColor.B)
bitmap.SetPixel(x, y, newclr)
Next
Next
Dim bmp As New Bitmap(bitmap.Width, bitmap.Height, bitmap.PixelFormat)
Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bitmap, 0, 0)
Return bmp
End Function
Public Shared Function TurnImageToGray(ByVal bitmap As Bitmap) As Bitmap
For x As Integer = 0 To bitmap.Width - 1
For y As Integer = 0 To bitmap.Height - 1
Dim bmpColor As Color = bitmap.GetPixel(x, y)
Dim newclr As Color = Color.FromArgb(bmpColor.R, bmpColor.R, bmpColor.R)
bitmap.SetPixel(x, y, newclr)
Next
Next
Dim bmp As New Bitmap(bitmap.Width, bitmap.Height, bitmap.PixelFormat)
Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bitmap, 0, 0)
Return bmp
End Function
End Class
بالتوفيق
أخوكم عمر