تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الحلقة الثامنة من السلسلة 167- دارسة في الألوان
#1
كاتب الموضوع : FlyToAbd

الكثير من المبرمجين يحتاج إلى المزيد من الخبرة في الألوان التي تساعده في أي برنامج يتعامل مع الألوان بكثرة مثل برامج الرسم وتحويل الصور وما إلى ذلك

الكل يعرف أن الألوان في الشاشة هي عبارة عن ضوء، والأضواء الأساسية هي الأحمر Red والأخضر Green والأزرق Blue ودعيت اختصارا RGB ويمكن التأكد من ذلك بواسطة التقرب من أي شاشة ملونة تعرض اللون الأبيض أو بواسطة عدسة لتكبير أجزاء الشاشة.

تطورت طرق عرض المعلومات على شاشة الكومبيوتر بما يخص الألوان من أحادية اللون وهو الأبيض (الأسود سيظهر عند عدم وجود الأبيض) ثم إلى الملونة وكانت عدد الألوان الممكن عرضها على النقطة الواحدة هي 16 ثم 256 لون (تحفظ بهذا الأسلوب الصور من نوع Gif) حيث يمثل لون النقطة الواحدة على الشاشة بايت واحد (أي 8 بت) ثم إلى 16 بت ... وجميع الأساليب السابقة تعتبر طرق لتقليل استخدام ذاكرة العرض لزيادة سرعة عمل الجهاز، ولذلك سوف لن نشرحها للتركيز على المهم.

ثم انتقلت إلى 24 بت الذي يعتبر مرحلة مهمة بزيادة حجم الذاكرة المخصصة للنقطة الواحدة على الشاشة حيث تم حجز بايت لمقدار تدريج الأحمر وبايت لمقدار تدريج الأخضر وآخر للأزرق أي كل نقطة على الشاشة يكون لونها من كمية من الأحمر وكمية من الأخضر وكمية من الأزرق وكل منها تكون قيمته 0 – 255 وبذلك أصبح بالإمكان عرض الشاشة بحيث كل نقطة يمكن أن يكون لونها واحد من 16777216 لون وهذا الرقم عبارة عن ناتج 256 * 256 * 256 أو عبارة عن 24^2 (اثنان مرفوعة للأس 24) وهذا الكم من الألوان يغطي كل حاجة العين أي لو تم مليء نصف الشاشة بأي لون ومليء النصف الثاني باللون الذي يليه العين لا تفرق بين الاثنين.

ثم انتقلت إلى 32 بت حيث أضيف بايت رابع لكل نقطة وهو يمثل مدى شفافية هذا اللون وسمي Alpha وأصبح الاختصار ARGB ويستفاد منه في عرض الصور فوق بعضها حيث يمكن أن تكون أجزاء من الصورة شفافة بمقدار معين (0 - 255) ليظهر لون النقطة في الصورة التي خلفه، والصفر يعني ان اللون سيظهر من غير أي شفافية و255 يكون اللون شفافاً بحيث يظهر الذي تحته بالكامل.

ولذلك يمكن استخراج مقدار البايت الأحمر من لون معين برمجياً من خلال الخاصية Color.R ولدينا أيضاً Color.G وكذلك Color.B (ولا ننسى Color.A) ولإنتاج لون يمكن استخدام الدالة Color.Argb ويمكن ان نمرر لها مقدار الشفافية A ثم الأحمر فالأخضر فالأزرق أو نمرر لها الثلاث الأخيرة وإهمال الشفافية كما في المثال التالي.


كود :
[align=right][color=black][FONT=Arial]Dim SrcColor As Color = Color.FromArgb(20, 50, 120, 245[/FONT][/color][/align]
[color=black][FONT=Arial]Dim PartA As Byte[/FONT][/color]
[color=black][FONT=Arial]Dim PartR As Byte[/FONT][/color]
[color=black][FONT=Arial]Dim PartG As Byte[/FONT][/color]
[color=black][FONT=Arial]Dim PartB As Byte[/FONT][/color]
[color=black][FONT=Arial]PartA = SrcColor.A[/FONT][/color]
[color=black][FONT=Arial]PartR = SrcColor.R[/FONT][/color]
[color=black][FONT=Arial]PartG = SrcColor.G[/FONT][/color]
[color=black][FONT=Arial]PartB = SrcColor.B[/FONT][/color]
وأكثر نوع صور انتشاراً يعتمد RGB هو الصور ذات الامتداد Bmp والتي تحافظ على مقادير تدريجات الألوان بعد الحفظ بالرغم من سوءه في الاقتصاد بالحجم (على عكس النوع ذا الامتداد Jpg) ولذلك نجد ماكروسوفت اعتمدت هذا النوع لسنوات طويلة، وأفضل نوع صور يعتمد ARGB هو الصور ذات الامتداد Png وهو يعتبر اقتصادياً بالحجم (المعتد حالياً من قبل مايكروسوفت) .

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

ولذلك تولدت طريقة جديدة لاختيار اللون تعتمد المصطلحات البشرية ويقوم النظام بترجمتها إلى RGB (الشفافية مصطلح ثابت) التي تفهمها الآلة وهذه المصطلحات هي Hue وتعني اللون احمر أم برتقالي أم أصفر أم بنفسجي والثاني هو Saturation وتعني الاشراقية (كم مقدار إشراق اللون أو شطارته وإذا كانت قليلة يكون اللون باهتاً قديماً قريب من الرمادي) والثالث Brightness السطوع (كم يكون اللون غامقاً أو فاتحاً).



وللحصول على مقادير هذه المصطلحات برمجياً من لون معين نستخدم الدوال الخاصة بها في اللون كما في المثال التالي


كود :
[color=black][FONT=Tahoma]Dim SrcColor As Color = Color.FromArgb(0, 128, 255, 80)[/FONT][/color]
[color=black][FONT=Tahoma]Dim PartH As Single[/FONT][/color]
[color=black][FONT=Tahoma]Dim PartS As Single[/FONT][/color]
[color=black][FONT=Tahoma]Dim PartB As Single[/FONT][/color]

[color=black][FONT=Tahoma]PartH = SrcColor.GetHue[/FONT][/color]
[color=black][FONT=Tahoma]PartS = SrcColor.GetSaturation[/FONT][/color]
[color=black][FONT=Tahoma]PartB = SrcColor.GetBrightness[/FONT][/color]

عند النظر لهذه الدوال ومقارنتها بالـ RGB نلاحظ أن هذه الدوال ترجع عدد حقيقي محصور بين 0 – 1 كذلك لا توجد الدالة Color.FromHSB (لعدم دقة نتائجها لأنها ستكون تقريبية والذي يتعمق بهذا الموضوع سيجد تفاصيل أكثر دقة من هذا الكلام) وقد قمت سابقاً بعمل هذه الدالة وسألحقها في هذا الموضوع وقد استخدمتها في فكرة ...

نجد بعض الصور الخاصة بسطح المكتب يكون شكلها عبارة عن لون معين متدرج بأشكال جميلة ونلاحظ أن اللون في كل الصورة واحد مثلا قماش شفاف بلون أصفر متطاير أمام العدسة بحيث يملأ الصورة بالكامل والحركات جميلة لكن لو رغبت باستبدال اللون الأصفر بلون بنفسجي فمن الصعب جدا قراءة RGB لكل نقطة وتحويل الأصفر في الصورة إلى بنفسجي وهو متدرج من الفاتح إلى الغامق فاضطررت لعمل الدالة Color.FromHSB واستخدمتها وكانت النتيجة رائعة.

سأبحث عنها وعن التطبيق وأضيفه كمشاركة في هذا الموضوع قريباً إن شاء الله
الرد }}}
تم الشكر بواسطة:



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


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