05-10-12, 06:46 PM
كاتب الموضوع : silverlight
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
مقدمـــــة:
في أحد الموضوعات الموجودة بالموقع كنت قد كتبت عن كيفية إسترجاع الألوان الموجودة في أي صورة Image ولأسترجاع الألوان نحناج الي الأتي
1- تعربف أي صورة
2- تعريف لون ما بدون إعطاؤه أي قيمة
3- تعريف Array حيث سنملأها بالألوان الموجودة بالصورة
4- ثم باستخدام جملة For...............Next نستطيع أن نسترد الألوان الموجود بهذه الصورة عن طريق جملة GetPixel ومن ثم نستخدم الألوان كما يحلو لنا. لكننا سنكتشف أننا نسترد عدد ضخم جدا من الألوان في أي صورة نستخدمها
الكود التالي يوضح كيفية تنفيذ الخطوات أعلاه.....
المثال الأول :
كود :
Dim bmp As Bitmap = New Bitmap(My.Resources.imgsrv)
Dim ColorArray As New System.Collections.ArrayList()
Dim clr As Color
For y As Integer = 0 To bmp.Height - 1
For x As Integer = 0 To bmp.Width - 1
clr = bmp.GetPixel(x, y)
If Not ColorArray.Contains(clr) Then ColorArray.Add(clr)
Next
Nextالتعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - الجزء الثامن
في واقع الأمر و بما أننا نستطيع أن نسترجع أي لون لمكان ما علي أي صورة إذن فنحن نستطيع أن نستفيد من هذه الفكرة في أشياء أخري ومقال اليوم سيوضح كيفية الإستفادة من هذا الأمر..........
هل نحتاج الي وجود صورة أم لا
قد يتساءل البعض هل نحتاج إلي وجود صورة أم لا ؟ والإجابة علي هذا السؤال غالبا مرتبطة برؤية المبرمج في كتابة الكود فالمبرمج يستطيع أن يستخدم صورة موجودة علي جهازه أو أي صورة من أي مصدر مناسب أو يستطيع أن يبني الصورة ويرسمها من الصفر وهذا أمر ليس سهلا إلا في بعض الحالات القليلة والخطوات التالية توضح كيفية بناء صورة من الصفر
1- تعريف متغير عبارة عن Bitmap ونعطي له أبعاد مثل الطول Height والعرض Width
2- تعريف متغير يعبر عن Graphics Object من هذه الصورة ومن ثم نستخدمه في رسم ما نريد علي الصورة
الكود التالي يوضح فكرة بسيطة لبناء صورة من الصفر وسنلاحظ عند تجربة الكود وجود الصورة علي الفورم
المثال الثاني :
كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' تعريف أبعاد الصورة
Dim imageWidth As Integer = 100
Dim imageHeight As Integer = 75
' تعريف الصورة
Dim bmp As New Bitmap(imageWidth, imageHeight)
' تعريف الجرافكس
Dim gr As Graphics = Graphics.FromImage(bmp)
' رسم ما نريد من أشياء علي الصورة
Using lgb As New Drawing2D.LinearGradientBrush(New Rectangle(0, 0, 200, 250), Color.Transparent, Color.White, 90, True)
gr.FillRectangle(lgb, New Rectangle(0, 0, 250, 250))
End Using
Using lgb As New Drawing2D.LinearGradientBrush(New Rectangle(0, 0, 200, 250), Color.Transparent, Color.Blue, 0, False)
gr.FillRectangle(lgb, New Rectangle(0, 0, 250, 250))
End Using
Using borderpen As New Pen(Brushes.DarkCyan)
gr.DrawRectangle(borderpen, New Rectangle(0, 0, imageWidth - 1, imageHeight - 1))
End Using
gr.Dispose()
' إستخدام الصورة كما يحلو لنا
Me.BackgroundImage = bmp
Me.BackgroundImageLayout = Windows.Forms.ImageLayout.Center
End Subالأن وبدلا من ان نرسم صورة تحتوي علي رسومات عشوائية كما في المثال الثاني أعلاه لنحاول أن نرسم صورة لها شكل واضح قليلا وهي ستكون صورة تمثل ColorPicker والكود التالي يوضح ذلك. ستلاحظ عزيزي القارئ من الكود أدناه والموجود في المثال الثالث أننا قمنا بتعريف مصفوفة للألوان ثم رسمنا مجموعة من المربعات ثم ملأنا كل مربع بلون ما في مصفوقة الألوان وبالتالي سنحصل علي صورة شبيهة بأي ColorPicker ثم في الحدث Paint قمنا برسم هذه الصورة علي الفورم
المثال الثالث :
كود :
Public Class Form1
Private colors As Color(,)
Private pickerRect As Rectangle = Rectangle.Empty
Private bufferImage As Bitmap = Nothing
Private Sub CreateColors()
colors = New Color(5, 7) {}
colors(0, 0) = Color.White
colors(1, 0) = Color.FromArgb(224, 224, 224)
colors(2, 0) = Color.Silver
colors(3, 0) = Color.Gray
colors(4, 0) = Color.FromArgb(64, 64, 64)
colors(5, 0) = Color.Black
colors(0, 1) = Color.FromArgb(255, 192, 192)
colors(1, 1) = Color.FromArgb(255, 128, 128)
colors(2, 1) = Color.Red
colors(3, 1) = Color.FromArgb(192, 0, 0)
colors(4, 1) = Color.Maroon
colors(5, 1) = Color.FromArgb(64, 0, 0)
colors(0, 2) = Color.FromArgb(255, 224, 192)
colors(1, 2) = Color.FromArgb(255, 192, 128)
colors(2, 2) = Color.FromArgb(255, 128, 0)
colors(3, 2) = Color.FromArgb(192, 64, 0)
colors(4, 2) = Color.FromArgb(128, 64, 0)
colors(5, 2) = Color.FromArgb(128, 64, 64)
colors(0, 3) = Color.FromArgb(255, 255, 192)
colors(1, 3) = Color.FromArgb(255, 255, 128)
colors(2, 3) = Color.Yellow
colors(3, 3) = Color.FromArgb(192, 192, 0)
colors(4, 3) = Color.Olive
colors(5, 3) = Color.FromArgb(64, 64, 0)
colors(0, 4) = Color.FromArgb(192, 255, 192)
colors(1, 4) = Color.FromArgb(128, 255, 128)
colors(2, 4) = Color.Lime
colors(3, 4) = Color.FromArgb(0, 192, 0)
colors(4, 4) = Color.Green
colors(5, 4) = Color.FromArgb(0, 64, 0)
colors(0, 5) = Color.FromArgb(192, 255, 255)
colors(1, 5) = Color.FromArgb(128, 255, 255)
colors(2, 5) = Color.Cyan
colors(3, 5) = Color.FromArgb(0, 192, 192)
colors(4, 5) = Color.Teal
colors(5, 5) = Color.FromArgb(0, 64, 64)
colors(0, 6) = Color.FromArgb(192, 192, 255)
colors(1, 6) = Color.FromArgb(128, 128, 255)
colors(2, 6) = Color.Blue
colors(3, 6) = Color.FromArgb(0, 0, 192)
colors(4, 6) = Color.Navy
colors(5, 6) = Color.FromArgb(0, 0, 64)
colors(0, 7) = Color.FromArgb(255, 192, 255)
colors(1, 7) = Color.FromArgb(255, 128, 255)
colors(2, 7) = Color.Fuchsia
colors(3, 7) = Color.FromArgb(192, 0, 192)
colors(4, 7) = Color.Purple
colors(5, 7) = Color.FromArgb(64, 0, 64)
End Sub
Private Sub FillColorRectangle(ByVal g As Graphics, ByVal fillColor As Color, ByVal x As Integer, ByVal y As Integer)
Using sb As New SolidBrush(fillColor)
g.FillRectangle(sb, x, y, 15, 15)
g.DrawRectangle(New Pen(sb, 1), x, y, 15, 15)
End Using
End Sub
Private Sub CreateImage()
pickerRect = New Rectangle(0, 0, 90, 90)
Me.bufferImage = New Bitmap(Me.pickerRect.Width, Me.pickerRect.Height)
Dim g As Graphics = Graphics.FromImage(Me.bufferImage)
Me.CreateColors()
For i As Integer = 0 To 5
For j As Integer = 0 To 7
Me.FillColorRectangle(g, colors(i, j), j * (CSng(Me.pickerRect.Height / 8)), i * (CSng(Me.pickerRect.Width / 6)))
Next
Next
g.Dispose()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Me.CreateImage()
e.Graphics.DrawImage(bufferImage, Me.pickerRect)
End Sub
End Class1- نستطيع إسترجاع الألوان من أي صورة
2- نستطيع أن نبني صورة من الصفر
3- نستطيع تخليق اي صورة لها شكل واضح بشرط أن يكون لدينا دراية بسيطة بأوامر الرسم المختلفة
في المشاركة التالية سوف نبني كونترول يعتمد علي الأفكار أعلاه أي أننا سنقوم ببناء كونترول يعتمد علي تحويل أي صورة الي ColorPicker ومن ثم نسترجع أي لون منه ومن ثم نستخدمه كيفما نشاء مثل أي ColorPicker أخر.
بالتوفيق
أخوكم عمر
