الشبكة العربية لمطوري الألعاب

خبير مشرف مؤيد مارديني مشاركة 1

قمت بكتابة Class بالـ Visual Basic .Net لتحويل أي صورة ملونة إلى صورة فيها الرمادي فقط بدرجاته الـ 256 (طبعاً هذه الدرجات تتضمن الأبيض و الأسود).
هذا مثال على عملها :



يمكنك استخدامها كالتالي :

Dim Temp_Colorful_To_Gray_Pic As New Colorful_To_Gray_Pics
        PicBox.Image = Temp_Colorful_To_Gray_Pic.Colorful_To_Gray_Pic(PicBox.Image)


ها هو الكود :

'/==============================================================================='| Class Name   : Colorful_To_Gray_Pics                                          |
'| Author       : Moayad Mardini [moayad.m@gmail.com]                            |
'| Forum        : In|Structurez [www.agdn-online.com]                           |
'| Blog         : InTechSpot [intechspot.blogspot.com, intechspot_a-t_gmail.com] |
'| Last Edit    : 25\03\2006                                                     |
'| Framework    : 2.0.50727                                                      |
'| IDE          : Microsoft Visual Studio .NET 2005 Professional Edition         |
'\===============================================================================/
Public Class Colorful_To_Gray_Pics
    Public Function Colorful_To_Gray_Pic(ByVal InputPic As Image) As Image
        Dim TempBitmap As New Bitmap(InputPic)
        Dim XIndex As Integer, YIndex As Integer, Average As Integer
        For XIndex = 0 To TempBitmap.Width - 1
            For YIndex = 0 To TempBitmap.Height - 1
                Dim TempColor As Color = TempBitmap.GetPixel(XIndex, YIndex)
                Average = Fix((Convert.ToInt32(TempColor.R) _
                + Convert.ToInt32(TempColor.G) + Convert.ToInt32(TempColor.B)) / 3)
                TempBitmap.SetPixel(XIndex, YIndex, Color.FromArgb(Average, Average, Average))
            Next YIndex
        Next XIndex
        Colorful_To_Gray_Pic = TempBitmap
    End Function
End Class


أي اقتراحات...
Moayad Mardini

Moayad Mardini,
MSDN Forums Moderator

خبير مدير وسام البهنسي مشاركة 2

رائع!
أحب أن أضيف كذلك أن المعادلة المستخدمة في هذا الكود لإيجاد النتيجة تعتمد على المتوسط بين قيم القنوات الثلاثة (الأحمر، الأخضر والأزرق).
يمكننا أيضاً استخدام أوزان مختلفة بدلاً من الثلث لكل قناة لإعطاء الأهمية لقناة أكثر من أخرى. كمثال الأوزان التالية:
أحمر: 0.299
أخضر: 0.587
أزرق: 0.114
هي جزء من المصفوفة المعتمدة في التحويل إلى النظام اللوني YIQ انطلاقاً من RGB، وهي تأخذ بعين الاعتبار درجة حساسية العين البشرية للألوان المختلفة (الأخضر أكثرها تأثيراً، والأزرق أقلها تأثيراً).


MSDN Game Technology Forums Moderator

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير مشرف مؤيد مارديني مشاركة 3

فعلاً, قمت بتطبيق الطريقة التي اقترحتها و حصلت على نتائج أفضل بكثير, شكراً...
هذا مثال يظهر أن طريقة YIQ أفضل من طريقة المتوسط :


ها هو الكود الجديد :

'/==============================================================================='| Class Name   : Colorful_To_Gray_Pics                                          |
'| Author       : Moayad Mardini [moayad.m@gmail.com]                            |
'| Forum        : In|Structurez [www.agdn-online.com]                           |
'| Blog         : InTechSpot [intechspot.blogspot.com, intechspot_a-t_gmail.com] |
'| Last Edit    : 25\03\2006                                                     |
'| Framework    : 2.0.50727                                                      |
'| IDE          : Microsoft Visual Studio .NET 2005 Professional Edition         |
'\===============================================================================/
Public Class Colorful_To_Gray_Pics
    Public Function Colorful_To_Gray_Pic(ByVal InputPic As Image) As Image
        Dim TempBitmap As New Bitmap(InputPic)
        Dim XIndex As Integer, YIndex As Integer, YIQ As Integer
        For XIndex = 0 To TempBitmap.Width - 1
            For YIndex = 0 To TempBitmap.Height - 1
                Dim TempColor As Color = TempBitmap.GetPixel(XIndex, YIndex)
                YIQ = (TempColor.R * 0.299) + (TempColor.G * 0.587) + (TempColor.B * 0.114)
                TempBitmap.SetPixel(XIndex, YIndex, Color.FromArgb(YIQ, YIQ, YIQ))
            Next YIndex
        Next XIndex
        Colorful_To_Gray_Pic = TempBitmap
    End Function
End Class


Moayad Mardini

Moayad Mardini,
MSDN Forums Moderator

خبير مدير وسام البهنسي مشاركة 4

ليس الموضوع موضوع أفضل تماماً. الصورة التي استخدمتها تظهر الفرق بين الطريقتين بشكل أقصى (extreme)☺
الطريقتين صحيحتين، لكن بحسب النتيجة التي تريدها، قد ترغب بالأولى أو الثانية أو حتى تجرب أوزان أخرى قد تغفل القيم اللونية لقنوات بكاملها☺


MSDN Game Technology Forums Moderator

وسام البهنسي
مبرمج في إنفيديا وإنفريمز