تقييم الموضوع :
  • 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


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات ابو ليلى 4 4,871 08-09-22, 11:54 AM
آخر رد: saif2023
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 7,827 19-07-22, 12:15 AM
آخر رد: StartLight4000
Video [درس فيديو] تقارير الكريستال ريبورت وتغيير مسار الصور أثناء التشغيل رمضان272 0 1,607 28-03-22, 03:18 AM
آخر رد: رمضان272
  شرح خوارزميات معالجة الصور (من دروس الاستاذ فوزي برزنجي) ناديه الشجيري 19 34,332 20-02-22, 02:13 PM
آخر رد: رضوان الجماعي
  التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة RaggiTech 3 5,859 30-07-21, 05:14 PM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع ملفات اوفيس من خلال مكتبة NPOI ابو ليلى 2 4,192 01-07-21, 11:42 AM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع اختصارات الملفات Shortcuts Magic Sword 2 4,415 01-10-20, 11:36 AM
آخر رد: abomo3ath
  [مقال] دوال التعامل مع النصوص Strings - VB.NET ابو ليلى 10 25,065 15-04-19, 07:09 PM
آخر رد: alsouf
  Compare Images المقارنة بين الصور Abu Ehab 0 3,269 31-10-18, 04:27 PM
آخر رد: Abu Ehab
  اصنع محرر أكواد خاص بك باستخدام الأداة RichTextBox السكر المغرور 13 7,506 19-08-18, 09:27 AM
آخر رد: elgokr

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


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