تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- أفكار في الدوت نت Image To ColorPicker
#1
كاتب الموضوع : 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 والكود التالي يوضح ذلك. ستلاحظ عزيزي القارئ من الكود أدناه والموجود في المثال الثالث أننا قمنا بتعريف مصفوفة للألوان ثم رسمنا مجموعة من المربعات ثم ملأنا كل مربع بلون ما في مصفوقة الألوان وبالتالي سنحصل علي صورة شبيهة بأي 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 Class
من الأمثلة الثلاثة أعلاه يتضح الأتي

1- نستطيع إسترجاع الألوان من أي صورة
2- نستطيع أن نبني صورة من الصفر
3- نستطيع تخليق اي صورة لها شكل واضح بشرط أن يكون لدينا دراية بسيطة بأوامر الرسم المختلفة

في المشاركة التالية سوف نبني كونترول يعتمد علي الأفكار أعلاه أي أننا سنقوم ببناء كونترول يعتمد علي تحويل أي صورة الي ColorPicker ومن ثم نسترجع أي لون منه ومن ثم نستخدمه كيفما نشاء مثل أي ColorPicker أخر.


بالتوفيق
أخوكم عمر
}}}
تم الشكر بواسطة:
#2
لكي نبني كونترول يأخذ أي صورة ويقوم بتحويلها الي ColorPicker نحتاج إلي أن نستخدم الوراثة من كونترول عادي Control Class ثم نضيف بعض السمات الجديدة الي الكونترول وهي كالأتي

1- متغير يعبر عن أي صورة ....... ولذلك سنحتاج أيضا الي Property لهذا الغرض
2- متغير عبارة عن نقطة Point يعبر عن مكان الماوس علي الصورة....
3- نحتاج الي إضافة حدث Event تأكد منه أن مكان الماوس علي الصورة قد تغير وبالتالي نطلق هذا الحدث ومن ثم نسترجع لون ما من الصورة بناء علي ذلك
4- نحتاج الي استرجاع اللون من الصورة لذلك سنحتاج الي Property لهذا الغرض

لنبدأ بناء الكونترول .........

الخطوات التالية توضح كيفية بناء الكونترول بالتفصيل

1- من قائمة File علك باختيار New Project "مشروع جديد" ثم من نافذة New Project عليك أن تختار نوع هذا المشروع وبما أننا نبني كونترول جديد ليكن مشروعنا من النوع Class Library وأعطي لمشروعك أي إسم تراه مناسبا

2- ثم من قائمة Project نختار Add Reference..... وهنا ستظهر لك نافذة Add Reference ومنها عليك إضافة فضاء الأسماء التالية
System.Windows.Forms
System.Drawing

3- قم بتغيير إسم الكلاس الموجود في المشروع من Class1 الي ImageColorPicker أو يمكنك استخدام أي مسمي تراه مناسبا

4- استخدم جملة Imports ثم أضف فضاء الأسماء التالية الي الكلاس

System.Windows.Forms
System.Drawing
System.Drawing.Drawing2D
System.ComponentModel

5- استخدم جملة Inherit للتوريث من Control Class

لو تم تنفيذ الخطوات أعلاه بشكل دقيق ستحصل عل الشكل التالي من الكود


كود :
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.ComponentModel

Public Class ImageColorPicker
Inherits Control

End Class
6- أضف المتغيرات التالية إلي الكلاس

- المتغير الأول عبارة عن Integer وهو يعبر عن البعد بين مكان رسم الصورة علي الكونترول و Control ClientRectangle أو بمعني أدق يعبر عن Padding حول الصورة المرسومة عل الكونترول
- المتغير الثاني عبارة عن Color وهو اللون الذي نحتاج أن نسترجعه من الكونترول
- المتغير الثالث يعبر عن نقطة Point وهو يمثل النقطة التي تحدد مكان اللون علي الصورة وذلك عندما يتحرك الماوس علي الصورة المرسومة علي الكونترول
- المتغير الرابع وهو عبارة عن Bitmap وهو يمثل الصورة التي سيقوم مستخدم الكونترول بتحديدها لكي يتم رسمها علي الكونترول وهي تتغير تبعا لرغبة المستخدم
- المتغير الخامس والأخير عبارة عن Bitmap أيضا وهو يمثل الصورة الحقيقية التي يتم رسمها علي الكونترول وهي لا تظهر للمستخدم


كود :
#Region " Fields "

Private imageBorders As Integer = 5
Private colorSelected As Color = Color.Empty
Private selectedPoint As Point = New Point(-1, -1)
Private pickerImage As Bitmap = Nothing
Private internalImage As Bitmap = Nothing

#End Region
7- أضف Constructor التالي الي الكونترول والمقصد هنا هو إضافة Sub New
والهدف الأوحد من الأكواد هو تقليل حجم Flicker أثناء عملية الرسم علي الكونترول


كود :
#Region " Constructor "

Public Sub New()
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.Opaque, False)
SetStyle(ControlStyles.DoubleBuffer, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.UserPaint, True)
UpdateStyles()
End Sub

#End Region
8- قبل أن نكتب أي أكواد أخري نحتاج الي كتابة الروتين الأتي والهدف منه هو التاكد أن أي نقطة سنحددها لاحقا يجب أن تكون داخل حدود الصورة المرسومة علي الكونترول والكود التالي يوضح شكل هذا الروتين


كود :
Private Sub CheckColorPoint(ByRef pt As Point)
If (pt.X - Me.imageBorders) < 0 Then
pt.X = Me.imageBorders
End If
If pt.X > ((MyBase.Width - Me.imageBorders) - 1) Then
pt.X = (MyBase.Width - Me.imageBorders) - 1
End If
If (pt.Y - Me.imageBorders) < 0 Then
pt.Y = Me.imageBorders
End If
If pt.Y > ((MyBase.Height - Me.imageBorders) - 1) Then
pt.Y = (MyBase.Height - Me.imageBorders) - 1
End If
End Sub
9- لنكتب رويتنا بسيطا أخر لرسم الصورة وستلاحظون أننا نأخذ الصورة التي يختارها مستخدم الكونترول ثم نعيد رسمها مرة أخري من خلال المتغير internalImage


كود :
Private Sub DrawPickerImage()
If MyBase.Width > 0 AndAlso Me.pickerImage IsNot Nothing Then
Me.internalImage = New Bitmap(MyBase.Width - (Me.imageBorders * 2), MyBase.Height - (Me.imageBorders * 2))
Dim g As Graphics = Graphics.FromImage(Me.internalImage)
Dim mode As SmoothingMode = g.SmoothingMode
g.SmoothingMode = SmoothingMode.AntiAlias
Dim rect As New Rectangle(0, 0, Me.internalImage.Width, Me.internalImage.Height)
g.DrawImage(pickerImage, rect)
g.SmoothingMode = mode
g.Dispose()
End If
End Sub

10- لنكتب دالة بسيطة نتأكد بها من أن النقطة التي يتم استرجاعها عبارة عن لون ونربطها بجملة GetPixel ومن ثم نحدد النقطة المراد إسترجاعها


كود :
Private Function IsColorFromPoint(ByVal pt As Point) As Boolean
Me.CheckColorPoint(pt)
If Me.pickerImage IsNot Nothing Then
If (((pt.X - Me.imageBorders) >= 0) AndAlso ((pt.X - Me.imageBorders) < Me.internalImage.Width)) AndAlso (((pt.Y - Me.imageBorders) >= 0) AndAlso ((pt.Y - Me.imageBorders) < Me.internalImage.Height)) Then
Dim pixelColor As Color = Me.internalImage.GetPixel(pt.X - Me.imageBorders, pt.Y - Me.imageBorders)
If pixelColor.A > 0 Then
Me.colorSelected = pixelColor
Me.selectedPoint.X = pt.X - Me.imageBorders
Me.selectedPoint.Y = pt.Y - Me.imageBorders
Return True
End If
End If
End If
Return False
End Function
10- لنضيف الحدث SelectedColorChanged الي الكونترول


كود :
#Region " Events "

Public Custom Event SelectedColorChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("SelectedColorChangedEvent", value)
End AddHandler

RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("SelectedColorChangedEvent", value)
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("SelectedColorChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event

#End Region
11- لنضيف Properties التالية الي الكونترول وأرجو أن تلاحظوا كيف يتم استرجاع اللون بناء علي المتغير selectedPoint


كود :
#Region " Properties "

Public Property SelectedColor() As Color
Get
Return Me.colorSelected
End Get
Set(ByVal value As Color)
Me.colorSelected = value
Dim w As Integer = MyBase.Width - (2 * Me.imageBorders)
Dim h As Integer = MyBase.Height - (2 * Me.imageBorders)
Me.selectedPoint.X = ((255 - Me.SelectedColor.GetBrightness()) * w) / 255
Me.selectedPoint.Y = ((255 - Me.SelectedColor.GetSaturation) * h) / 255
Me.DrawPickerImage()
MyBase.Invalidate()
End Set
End Property

Public Property Image As Bitmap
Get
Return Me.pickerImage
End Get
Set(ByVal value As Bitmap)
Me.pickerImage = value
Me.DrawPickerImage()
Me.Invalidate()
End Set
End Property

Protected Overrides ReadOnly Property DefaultSize As System.Drawing.Size
Get
Return New Size(100, 100)
End Get
End Property

#End Region
12- أخر شئ نقوم بعمل Overrides لبعض الأحداث الموجودة بالكونترول لكي نرسم الصورة وأيضا لكي نربط المتغير selectedPoint مع حركة الماوس


كود :
Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseDown(e)
If Me.IsColorFromPoint(e.Location) Then
If Not Me.Focused Then
MyBase.Focus()
End If
MyBase.Invalidate()
Me.onSelectedcolorchanged(New EventArgs())
End If
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseMove(e)
If (e.Button = MouseButtons.Left) AndAlso Me.IsColorFromPoint(e.Location) Then
MyBase.Invalidate()
Me.onSelectedcolorchanged(New EventArgs())
End If
End Sub

Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
MyBase.OnEnter(e)
MyBase.Invalidate()
End Sub

Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
MyBase.OnLeave(e)
MyBase.Invalidate()
End Sub

Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
Me.DrawPickerImage()
MyBase.OnSizeChanged(e)
End Sub

Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
Me.DrawPickerImage()
MyBase.OnResize(e)
End Sub

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)

Dim mode As SmoothingMode = e.Graphics.SmoothingMode
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
If Me.internalImage IsNot Nothing Then
Using lgb As New LinearGradientBrush(Me.ClientRectangle, Color.Black, Color.FromArgb(200, Color.Black), 90, False)
e.Graphics.FillRectangle(lgb, Me.ClientRectangle)
End Using
e.Graphics.DrawImage(Me.internalImage, Me.imageBorders, Me.imageBorders)
End If

If Me.selectedPoint.X > -1 Then
Dim r As New Rectangle((Me.imageBorders + Me.selectedPoint.X) - 5, (Me.imageBorders + Me.selectedPoint.Y) - 5, 10, 10)
Using sb As Brush = New SolidBrush(Me.colorSelected)
e.Graphics.FillEllipse(sb, r)
End Using
e.Graphics.DrawEllipse(Pens.White, r)
r.Inflate(1, 1)
e.Graphics.DrawEllipse(Pens.Black, r)
End If

e.Graphics.SmoothingMode = mode
End Sub

Protected Sub onSelectedcolorchanged(ByVal e As EventArgs)
Dim handler As EventHandler = CType(Me.Events("SelectedColorChangedEvent"), EventHandler)
If handler IsNot Nothing Then
handler.Invoke(Me, e)
End If
End Sub

في المشاركة التالية سوف أضع نسخة من الكود الخاص بالكلاس كاملا وكيفية استخدام هذا الكونترول

تقبلوا تحياتي
أخوكم عمر
}}}
تم الشكر بواسطة:
#3
الكود الخاص بالكونترول كاملا


كود :
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.ComponentModel

<DefaultEvent("SelectedColorChanged")> _
Public Class ImageColorPicker
Inherits Control

#Region " Fields "

Private imageBorders As Integer = 5
Private colorSelected As Color = Color.Empty
Private selectedPoint As Point = New Point(-1, -1)
Private pickerImage As Bitmap = Nothing
Private internalImage As Bitmap = Nothing

#End Region

#Region " Constructor "

Public Sub New()
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.Opaque, False)
SetStyle(ControlStyles.DoubleBuffer, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.UserPaint, True)
UpdateStyles()
End Sub

#End Region

#Region " Properties "

Public Property SelectedColor() As Color
Get
Return Me.colorSelected
End Get
Set(ByVal value As Color)
Me.colorSelected = value
Dim w As Integer = MyBase.Width - (2 * Me.imageBorders)
Dim h As Integer = MyBase.Height - (2 * Me.imageBorders)
Me.selectedPoint.X = ((255 - Me.SelectedColor.GetBrightness()) * w) / 255
Me.selectedPoint.Y = ((255 - Me.SelectedColor.GetSaturation) * h) / 255
Me.DrawPickerImage()
MyBase.Invalidate()
End Set
End Property

Public Property Image As Bitmap
Get
Return Me.pickerImage
End Get
Set(ByVal value As Bitmap)
Me.pickerImage = value
Me.DrawPickerImage()
Me.Invalidate()
End Set
End Property

Protected Overrides ReadOnly Property DefaultSize As System.Drawing.Size
Get
Return New Size(100, 100)
End Get
End Property

#End Region

#Region " Methods "

Private Sub CheckColorPoint(ByRef pt As Point)
If (pt.X - Me.imageBorders) < 0 Then
pt.X = Me.imageBorders
End If
If pt.X > ((MyBase.Width - Me.imageBorders) - 1) Then
pt.X = (MyBase.Width - Me.imageBorders) - 1
End If
If (pt.Y - Me.imageBorders) < 0 Then
pt.Y = Me.imageBorders
End If
If pt.Y > ((MyBase.Height - Me.imageBorders) - 1) Then
pt.Y = (MyBase.Height - Me.imageBorders) - 1
End If
End Sub

Private Function IsColorFromPoint(ByVal pt As Point) As Boolean
Me.CheckColorPoint(pt)
If Me.pickerImage IsNot Nothing Then
If (((pt.X - Me.imageBorders) >= 0) AndAlso ((pt.X - Me.imageBorders) < Me.internalImage.Width)) AndAlso (((pt.Y - Me.imageBorders) >= 0) AndAlso ((pt.Y - Me.imageBorders) < Me.internalImage.Height)) Then
Dim pixelColor As Color = Me.internalImage.GetPixel(pt.X - Me.imageBorders, pt.Y - Me.imageBorders)
If pixelColor.A > 0 Then
Me.colorSelected = pixelColor
Me.selectedPoint.X = pt.X - Me.imageBorders
Me.selectedPoint.Y = pt.Y - Me.imageBorders
Return True
End If
End If
End If
Return False
End Function

Protected Sub onSelectedcolorchanged(ByVal e As EventArgs)
Dim handler As EventHandler = CType(Me.Events("SelectedColorChangedEvent"), EventHandler)
If handler IsNot Nothing Then
handler.Invoke(Me, e)
End If
End Sub

Private Sub DrawPickerImage()
If MyBase.Width > 0 AndAlso Me.pickerImage IsNot Nothing Then
Me.internalImage = New Bitmap(MyBase.Width - (Me.imageBorders * 2), MyBase.Height - (Me.imageBorders * 2))
Dim g As Graphics = Graphics.FromImage(Me.internalImage)
Dim mode As SmoothingMode = g.SmoothingMode
g.SmoothingMode = SmoothingMode.AntiAlias
Dim rect As New Rectangle(0, 0, Me.internalImage.Width, Me.internalImage.Height)
g.DrawImage(pickerImage, rect)
g.SmoothingMode = mode
g.Dispose()
End If
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseDown(e)
If Me.IsColorFromPoint(e.Location) Then
If Not Me.Focused Then
MyBase.Focus()
End If
MyBase.Invalidate()
Me.onSelectedcolorchanged(New EventArgs())
End If
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseMove(e)
If (e.Button = MouseButtons.Left) AndAlso Me.IsColorFromPoint(e.Location) Then
MyBase.Invalidate()
Me.onSelectedcolorchanged(New EventArgs())
End If
End Sub

Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
MyBase.OnEnter(e)
MyBase.Invalidate()
End Sub

Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
MyBase.OnLeave(e)
MyBase.Invalidate()
End Sub

Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
Me.DrawPickerImage()
MyBase.OnSizeChanged(e)
End Sub

Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
Me.DrawPickerImage()
MyBase.OnResize(e)
End Sub

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)

Dim mode As SmoothingMode = e.Graphics.SmoothingMode
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
If Me.internalImage IsNot Nothing Then
Using lgb As New LinearGradientBrush(Me.ClientRectangle, Color.Black, Color.FromArgb(200, Color.Black), 90, False)
e.Graphics.FillRectangle(lgb, Me.ClientRectangle)
End Using
e.Graphics.DrawImage(Me.internalImage, Me.imageBorders, Me.imageBorders)
End If

If Me.selectedPoint.X > -1 Then
Dim r As New Rectangle((Me.imageBorders + Me.selectedPoint.X) - 5, (Me.imageBorders + Me.selectedPoint.Y) - 5, 10, 10)
Using sb As Brush = New SolidBrush(Me.colorSelected)
e.Graphics.FillEllipse(sb, r)
End Using
e.Graphics.DrawEllipse(Pens.White, r)
r.Inflate(1, 1)
e.Graphics.DrawEllipse(Pens.Black, r)
End If

e.Graphics.SmoothingMode = mode
End Sub

#End Region

#Region " Events "

Public Custom Event SelectedColorChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("SelectedColorChangedEvent", value)
End AddHandler

RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("SelectedColorChangedEvent", value)
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("SelectedColorChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event

#End Region

End Class ' ImageColorPicker
}}}
تم الشكر بواسطة:
#4
كيف نستخدم الكونترول

قم بعمل Build للكونترول ومن ثم سيظهر لك نسخة منه في نافذة الأدوات حيث يمكن بعد ذلك أن تضيفه الي أي فورم
ثم حدد أي صورة من علي جهازك باستخدام Image Property الخاصة بالكونترول
ثم عليك إستخدام أو إطلاق الحدث SelectedColorChanged ومن ثم تساوي متغير يعبر عن لون ما وتساويه مع SelectedColor Property الخاصة بالكونترول والكود التالي يوضح ذلك

عندما يعمل الفورم ستجد علي الكونترول دائرة صغيرة ................ حاول أن تحرك هذه الدائرة باستخدام الماوس واكتشف ماذا سوف يحدث


كود :
Public Class Form1

Private selectedColor As Drawing.Color = Drawing.Color.Empty

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.DoubleBuffered = True
End Sub

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Dim r As New Drawing.Rectangle(0, 0, Me.Width, 50)
Using sb As New Drawing.SolidBrush(selectedColor)
e.Graphics.FillRectangle(sb, r)
End Using
End Sub

Private Sub ImageColorPicker1_SelectedColorChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageColorPicker1.SelectedColorChanged
selectedColor = Me.ImageColorPicker1.SelectedColor
Me.Invalidate()
End Sub

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

ولمن يريد التطوير وتحويل الكونترول الي ColorPicker عادي فليستخدم الكود الموجود في المشاركة الأولي وتحديدا في المثال الثالث لكي يرسم ColorPicker العادية ومن ثم يستخدم الصورة الناتجة مع Image Property أو يمكنكم إعادة كتابة الكلاس بشكل يؤدي نفس الهدف ولمن لا يستطيع أن يفعل ذلك يمكنه أن يترك تعليقا وسوف أكتب له الكود لاحقا

تقبلوا تحياتي ولا تنسونا في دعائكم
أخوكم عمر


الملفات المرفقة
.rar   ImageToColorPicker.rar (الحجم : 237.45 ك ب / التحميلات : 62)
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة RaggiTech 3 5,867 30-07-21, 05:14 PM
آخر رد: kebboud
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,162 30-06-19, 10:41 AM
آخر رد: invocker
  التــعامل مع cmd من خلال الدوت نت مبتدئ في الاحتراف 3 3,782 02-06-18, 12:36 AM
آخر رد: YousefOkasha
  [VB.NET] ارجو المساعدة : How to Split an Image into Chunks amna jamal 2 2,158 23-01-18, 05:05 AM
آخر رد: silverlight
  أفكار في الجرافكس AlignRectangle silverlight 0 1,558 14-10-17, 02:02 PM
آخر رد: silverlight
  مقارنة صورتين و الحصول علي الفرق بينهم Comparing Two Images and Get Diff Image silverlight 0 4,899 30-06-17, 11:33 AM
آخر رد: silverlight
  تفقيط الارقام فى الدوت نت مبرمج أوتار 17 12,406 20-04-17, 12:21 PM
آخر رد: محمد بوقزاحة
  Create, Save Tiff Image & Extract Images From TIFF Image silverlight 0 2,623 09-10-15, 01:40 PM
آخر رد: silverlight
  [مقال] Check the file format of an Image silverlight 3 3,378 28-05-14, 05:02 PM
آخر رد: Sajad
  [مقال] تشغيل برمجيات الدوت نت بدون تنصيب النت فروم ويرك m0075 13 10,491 13-02-14, 08:29 PM
آخر رد: Omar Mekkawy

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


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