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

التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI
اللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2005 و 2008
المستوي: التقييم متروك للقارئ
إعداد: مهندس / عمر أمين إبراهيم

الجزء التاسع: التعامل مع الألوان في الصورة باستخدام Color Matrix

كيف نتحكم في ألوان الصورة عن طريق استخدام ColorMatrix Class أو من الممكن أن نطلق عليها مصفوفة الألوان
وهي مصفوفة بها مجموعة من المعاملات Coefficients وهذه المعاملات عبارة عن 5 أعمدة في 5 صفوف تتراوح قيمتها بين الرقمين صفر و 1 ولو قمنا بالتغيير أو بالتعديل علي قيمة هذه المعاملات سوف نستطيع التغيير في ألوان الصورة وبخاصة أن أي صورة يكون شكل المصفوفة لها كما هو موضح بالكود التالي وهو الشكل الطبيعي لأي صورة بدون تعديلات في ألوانها أي انك لو استخدمت المصفوفة بالشكل الموضح أدناه فلن يحدث تعديل للصورة وبالتبعية يمكن استغلال هذه الكود لكي تسترجع الصورة الأصلية في أي وقت تشاء


كود :
Dim cm As System.Drawing.Imaging.ColorMatrix = _
New System.Drawing.Imaging.ColorMatrix(New Single()() _
{New Single() {1, 0, 0, 0, 0}, _
New Single() {0, 1, 0, 0, 0}, _
New Single() {0, 0, 1, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {0, 0, 0, 0, 1}})
في واقع الأمر إن ما يربط الصور مع ColorMatrix Class هو كلاس أخر رائع اسمه ImageAttributes Class حيث باستخدام هذا الكلاس يمكننا أن نقوم بضبط الألوان بالصورة كما نريد
ويتم التعامل مع ألوان الصورة هنا عن طريق تحديد ColorMatrix معينة ثم تمريرها إلي ImageAttributes ثم استخدام الأخير في عملية رسم الصورة بالألوان الجديدة هذه هي الفكرة ببساطة والمثال التالي يوضح كيفية عمل ذلك
ولتنفيذ المثال افتح مشروع جديد ثم قم بتعريف صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي ثم بعد ذلك حاول تغيير القيم للمتغير Red و Blue و Green و Alphaعلي التوالي بأي أرقام تريدها بشرط أن لا تتعدي قيمتهم الرقم 1 ولا تقل عن الرقم صفر وهنا ستكتشف أن ما يفعله الكود التالي قد فعلناه سابقا باستخدام GetPixel و SetPixel


كود :
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 Red As Single = 0.9
Dim Green As Single = 0.9
Dim Blue As Single = 0.9
Dim Alpha As Single = 1
Dim w As Single = 1

Dim cm As System.Drawing.Imaging.ColorMatrix = _
New System.Drawing.Imaging.ColorMatrix(New Single()() _
{New Single() {1, 0, 0, 0, 0}, _
New Single() {0, 1, 0, 0, 0}, _
New Single() {0, 0, 1, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {Red, Green, Blue, Alpha, w}})

Dim imageAttr As New System.Drawing.Imaging.ImageAttributes
imageAttr.SetColorMatrix(cm)

Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, imageAttr)

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

End Sub

End Class
وسنعطي مثالا أخر لتوضيح كيف أن تغيير قيمة ColorMatrix سيؤدي الي تغيير الأوان الصورة
ولتنفيذ المثال افتح مشروع جديد ثم قم بتعريف صورة ثم أضف الي الفورم PictureBox ثم اكتب الكود بالشكل التالي ثم بعد ذلك حاول تغيير القيم للمتغير Red و Blue و Green و Alphaعلي التوالي بأي أرقام تريدها بشرط أن لا تتعدي قيمتهم الرقم 1 ولا تقل عن الرقم صفر وهنا ستكتشف أن ما يفعله هذا الكود التالي قد فعلناه سابقا باستخدام GetPixel و SetPixel أيضا وتحديدا الكود الخاص بالدالة TurnImageToMonoChrom Function


كود :
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 Red As Single = 0.3
Dim Green As Single = 0.11
Dim Blue As Single = 0.59
Dim Alpha As Single = 1
Dim w As Single = 1

Dim cm As System.Drawing.Imaging.ColorMatrix = _
New System.Drawing.Imaging.ColorMatrix(New Single()() _
{New Single() {Red, Red, Red, 0, 0}, _
New Single() {Blue, Blue, Blue, 0, 0}, _
New Single() {Green, Green, Green, 0, 0}, _
New Single() {0, 0, 0, Alpha, 0}, _
New Single() {0, 0, 0, 0, w}})

Dim imageAttr As New System.Drawing.Imaging.ImageAttributes
imageAttr.SetColorMatrix(cm)

Dim g As Graphics = Graphics.FromImage(bmp)
g.DrawImage(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, imageAttr)

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

End Sub

End Class
فيه ملحوظة علي الكود بالمثال اعلاه وخصوصا أنه وطبقا لمايكروسوفت فإنها تقول أن قيمة المتغير w يجب أن تساوي دائما الرقم 1 ولا اعلم السبب في واقع الأمر عموما هنا توجد علامة استفهام بسيطة حيث أنه يمكن تغير قيمة هذا الرقم تماما إلي أي قيمة لكن وبشكل عام قيمة هذا المتغير لا تؤثر علي شكل ColorMatrix وبخاصة انا استخدمت بدلا من هذا المتغير قيم مختلفة بالموجب والسالب ولم ألاحظ أي تأثير عند تغيير قيمته

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



كود :
Public Shared Function RevertImageColors(ByVal bitmap As Bitmap, ByVal R As Single, ByVal G As Single, ByVal B As Single) As Bitmap

Dim Red As Single = R / 255
Dim Green As Single = G / 255
Dim Blue As Single = B / 255

Dim cm As System.Drawing.Imaging.ColorMatrix = _
New System.Drawing.Imaging.ColorMatrix(New Single()() _
{New Single() {1, 0, 0, 0, 0}, _
New Single() {0, 1, 0, 0, 0}, _
New Single() {0, 0, 1, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {Red, Green, Blue, 0, 1}})

Dim imageAttr As New System.Drawing.Imaging.ImageAttributes
imageAttr.SetColorMatrix(cm)
Dim gr As Graphics = Graphics.FromImage(bitmap)
gr.DrawImage(bitmap, New Rectangle(0, 0, bitmap.Width, bitmap.Height), 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, imageAttr)

Return bitmap

End Function

Public Shared Function RevertImageToMono(ByVal bitmap As Bitmap) As Bitmap

Dim cm As System.Drawing.Imaging.ColorMatrix = _
New System.Drawing.Imaging.ColorMatrix(New Single()() _
{New Single() {0.3, 0.3, 0.3, 0, 0}, _
New Single() {0.59, 0.59, 0.59, 0, 0}, _
New Single() {0.11, 0.11, 0.11, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {0, 0, 0, 0, 1}})

Dim imageAttr As New System.Drawing.Imaging.ImageAttributes
imageAttr.SetColorMatrix(cm)
Dim gr As Graphics = Graphics.FromImage(bitmap)
gr.DrawImage(bitmap, New Rectangle(0, 0, bitmap.Width, bitmap.Height), 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, imageAttr)

Return bitmap

End Function

Public Shared Function RevertImageToNegative(ByVal bitmap As Bitmap) As Bitmap

Dim cm As System.Drawing.Imaging.ColorMatrix = _
New System.Drawing.Imaging.ColorMatrix(New Single()() _
{New Single() {-1, 0, 0, 0, 0}, _
New Single() {0, -1, 0, 0, 0}, _
New Single() {0, 0, -1, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {0, 0, 0, 0, 1}})

Dim imageAttr As New System.Drawing.Imaging.ImageAttributes
imageAttr.SetColorMatrix(cm)
Dim gr As Graphics = Graphics.FromImage(bitmap)
gr.DrawImage(bitmap, New Rectangle(0, 0, bitmap.Width, bitmap.Height), 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, imageAttr)

Return bitmap

End Function
طبعا وبخصوص الدالة RevertImageColors يفضل وضع شرط لتحديد اقل وأقصي قيمة للمتغيرات الموجودة داخل Function
ولنعطي مثالا علي استخدام إحدي الدوال الموجودة اعلاه ولتنفيذ المثال افتح مشروع جديد ثم قم بتعريف صورة ثم أضف له 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

PictureBox1.Image = RevertImageColors(bmp, 120, 190, 150)
PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage

End Sub

Public Shared Function RevertImageColors(ByVal bitmap As Bitmap, ByVal R As Single, ByVal G As Single, ByVal B As Single) As Bitmap

Dim Red As Single = R / 255
Dim Green As Single = G / 255
Dim Blue As Single = B / 255

Dim cm As System.Drawing.Imaging.ColorMatrix = _
New System.Drawing.Imaging.ColorMatrix(New Single()() _
{New Single() {1, 0, 0, 0, 0}, _
New Single() {0, 1, 0, 0, 0}, _
New Single() {0, 0, 1, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {Red, Green, Blue, 0, 1}})

Dim imageAttr As New System.Drawing.Imaging.ImageAttributes
imageAttr.SetColorMatrix(cm)
Dim gr As Graphics = Graphics.FromImage(bitmap)
gr.DrawImage(bitmap, New Rectangle(0, 0, bitmap.Width, bitmap.Height), 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, imageAttr)

Return bitmap

End Function

End Class


بالتوفيق

أخوكم عمر
}}}}
تم الشكر بواسطة: Mostafa Saad


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [درس فيديو] تحذير هام في التعامل مع For و Try ali.alfoly 3 120 07-12-16, 12:43 AM
آخر رد: silverlight
Wink [مقال] كفية التعامل مه الجملة الشرطية IF alims 8 3,533 19-11-16, 01:06 AM
آخر رد: LoveVb
  اصنع محرر أكواد خاص بك باستخدام الأداة RichTextBox السكر المغرور 8 1,538 03-09-16, 07:59 PM
آخر رد: tryold
  مشروع لجلب الصور من الماسحة الضوئية (Scanner) m.sami.ak 12 4,051 25-08-16, 09:30 PM
آخر رد: jassim316
  شرح خوارزميات معالجة الصور (من دروس الاستاذ فوزي برزنجي) ناديه الشجيري 14 7,825 09-04-16, 11:26 PM
آخر رد: بديع
  [درس فيديو] تشغيل اوامر Run من البرنامج & مثال غلق الويندوز بعد وقت محدد باستخدام VB.net أحمد النجار 1 544 23-12-15, 04:26 AM
آخر رد: الماجيك مسعد
Big Grin [مقال] كفية التعامل مع حلقة التكرار For , For Each alims 8 3,496 01-11-15, 11:51 PM
آخر رد: adel27
  [VB.NET] تشغيل Twain الخاص بسحب الصور من السكنر في حالة net framework4 ahmed saleh 4 680 25-10-15, 07:20 PM
آخر رد: عدنان الشمري
  Create, Save Tiff Image & Extract Images From TIFF Image silverlight 0 330 09-10-15, 01:40 PM
آخر رد: silverlight
  [VB.NET] التشفير باستخدام خوارزمية rsa alking-0999 10 1,398 08-07-15, 04:24 PM
آخر رد: مبرمج بلا حدود

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


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