الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية عمل Color Scale

بدأه Abboodd في 19 يناير 2009 · 10 رد · 1,626 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

إخواني، من المعروف أنني إذا أردت عمل صورة بدرجات اللون الرمادي، آخذ كل pixel من هذه الصورة، وآخذ الـR و الـG والB الخاص به، ثم أقوم بالتالي:

(R + G + B) / 3

وبالتالي تصبح الصورة ذات تدرج رمادي، مثلاً:

post-177799-1232368496_thumb.jpg

post-177799-1232368569_thumb.jpg

وبهذا عملنا تدرج رمادي Gray Scale ، والسؤال هو كيف أعمل تدرج بالنسبة للألوان الأخرى،

أرجو أن يكون السؤال واضحاً

جزاكم الله خيراً

هذه الجملة خاطئة  :wacko: 


#2

بسم الله

أرجو الإجابة إخواني، أنا أريد عملها هكذا،

post-177799-1232458164_thumb.jpg

طبعاً على لون يختاره المستخدم وليس لوناً محدداً، ربما بعض المعلومات عن طريقة ترتيب الألوان في نظام RGB يمكن أن تفيدني، ولكني لم أجد ما أريده بعد.

أرجو المساعدة

هذه الجملة خاطئة  :wacko: 


#3

مرحباً أخي عبود .

أعتقد أنك تبحث عن شيء كالـ Image Processing, سأرفق مثال حَملتُه من الـ A1VBCode, يحويّ الكثير من الإبداعات ( صراحةً = ليس هنالك كلمات لشكر المبدع الذي صممه )

كنت لأقول لك استخدم الـ ColorMatrix لكنه غير متوفر في الـ Vb6 :P .

بالتوفيق .

______________

أعتقد أنك تبحث عن هذا العملية :

 

[color= #000000; font-weight: bold;]Private Sub mnuGreen_Click[color= #009900;]([color= #009900;])

On Error Resume [color= #990000;]Next

Dim Color [color= #b1b100;]As Long

Dim i [color= #b1b100;]As Long

Dim j [color= #b1b100;]As Long

Dim c [color= #b1b100;]As Long

frmMain[color= #339933;].picMain[color= #339933;].Cls

[color= #b1b100;]If Sel [color= #339933;]= [color= #000000; font-weight: bold;]True Then

Sel [color= #339933;]= [color= #000000; font-weight: bold;]False

 

    [color= #b1b100;]For i [color= #339933;]= FX [color= #339933;]+ [color= #cc66cc;]1 To LX [color= #339933;]- [color= #cc66cc;]1

        [color= #b1b100;]For j [color= #339933;]= FY [color= #339933;]+ [color= #cc66cc;]1 To LY [color= #339933;]- [color= #cc66cc;]1

            Color [color= #339933;]= GetPixel[color= #009900;](frmMain[color= #339933;].picMain[color= #339933;].hdc[color= #339933;], i[color= #339933;], j[color= #009900;])

            r [color= #339933;]= Color Mod [color= #cc66cc;]256

            g [color= #339933;]= [color= #009900;](Color  [color= #cc66cc;]256[color= #009900;]) Mod [color= #cc66cc;]256

            b [color= #339933;]= Color  [color= #cc66cc;]256  [color= #cc66cc;]256

            SetPixel frmMain[color= #339933;].picMain[color= #339933;].hdc[color= #339933;], i[color= #339933;], j[color= #339933;], RGB[color= #009900;]([color= #cc66cc;]0[color= #339933;], g[color= #339933;], [color= #cc66cc;]0[color= #009900;])

        [color= #990000;]Next

        Bar[color= #339933;].[color= #990000;]Max [color= #339933;]= [color= #009900;](LX [color= #339933;]- [color= #cc66cc;]1[color= #009900;]) [color= #339933;]- [color= #009900;](FX [color= #339933;]+ [color= #cc66cc;]1[color= #009900;])

        Bar[color= #339933;].value [color= #339933;]= Bar[color= #339933;].value [color= #339933;]+ [color= #cc66cc;]1

    [color= #990000;]Next

Bar[color= #339933;].value [color= #339933;]= [color= #cc66cc;]0

frmMain[color= #339933;].picMain[color= #339933;].Refresh

Call Setpicture

[color= #b1b100;]Else

    [color= #b1b100;]For i [color= #339933;]= [color= #cc66cc;]0 To frmMain[color= #339933;].picMain[color= #339933;].ScaleWidth

        [color= #b1b100;]For j [color= #339933;]= [color= #cc66cc;]0 To frmMain[color= #339933;].picMain[color= #339933;].ScaleHeight

            Color [color= #339933;]= GetPixel[color= #009900;](frmMain[color= #339933;].picMain[color= #339933;].hdc[color= #339933;], i[color= #339933;], j[color= #009900;])

            r [color= #339933;]= Color Mod [color= #cc66cc;]256

            g [color= #339933;]= [color= #009900;](Color  [color= #cc66cc;]256[color= #009900;]) Mod [color= #cc66cc;]256

            b [color= #339933;]= Color  [color= #cc66cc;]256  [color= #cc66cc;]256

            SetPixel frmMain[color= #339933;].picMain[color= #339933;].hdc[color= #339933;], i[color= #339933;], j[color= #339933;], RGB[color= #009900;]([color= #cc66cc;]0[color= #339933;], g[color= #339933;], [color= #cc66cc;]0[color= #009900;])

 

        [color= #990000;]Next

        Bar[color= #339933;].[color= #990000;]Max [color= #339933;]= frmMain[color= #339933;].picMain[color= #339933;].ScaleWidth

        Bar[color= #339933;].value [color= #339933;]= Bar[color= #339933;].value [color= #339933;]+ [color= #cc66cc;]1

    [color= #990000;]Next

Bar[color= #339933;].value [color= #339933;]= [color= #cc66cc;]0

frmMain[color= #339933;].picMain[color= #339933;].Refresh

Call Setpicture

[color= #990000;]End [color= #b1b100;]If

Save [color= #339933;]= MDIForm1[color= #339933;].picSave[color= #339933;].UBound

Undo [color= #339933;]= Undo [color= #339933;]+ [color= #cc66cc;]1

[color= #b1b100;]If IsUndo [color= #339933;]= [color= #000000; font-weight: bold;]True Then

    IsUndo [color= #339933;]= [color= #000000; font-weight: bold;]False

    [color= #b1b100;]For s [color= #339933;]= Undo To Save

    Unload MDIForm1[color= #339933;].picSave[color= #009900;](s[color= #009900;])

    [color= #990000;]Next

Save [color= #339933;]= MDIForm1[color= #339933;].picSave[color= #339933;].UBound

[color= #990000;]End [color= #b1b100;]If

 

MDIForm1[color= #339933;].Toolbar2[color= #339933;].Buttons[color= #009900;]([color= #cc66cc;]4[color= #009900;])[color= #339933;].Enabled [color= #339933;]= [color= #000000; font-weight: bold;]True

Load MDIForm1[color= #339933;].picSave[color= #009900;](Save [color= #339933;]+ [color= #cc66cc;]1[color= #009900;])

MDIForm1[color= #339933;].picSave[color= #009900;](Save [color= #339933;]+ [color= #cc66cc;]1[color= #009900;])[color= #339933;].Picture [color= #339933;]= frmMain[color= #339933;].picMain[color= #339933;].Picture

MDIForm1[color= #339933;].Toolbar2[color= #339933;].Buttons[color= #009900;]([color= #cc66cc;]5[color= #009900;])[color= #339933;].Enabled [color= #339933;]= [color= #000000; font-weight: bold;]False

mnuBackward[color= #339933;].Enabled [color= #339933;]= [color= #000000; font-weight: bold;]True

mnuForward[color= #339933;].Enabled [color= #339933;]= [color= #000000; font-weight: bold;]False

 

[color= #990000;]End Sub

ليس بكاملها :P .

Painter22.zip

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 22 يناير 2009 في 06:54

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#4

جزاك الله خيراً يا بشار.

لكن هذا الكود لا يعمل إلا مع الألوان الثلاثة الأساسية.

على كل حال، انتظر قليلاً، لأن المشكلة تكاد تحل (بقي لها نكشة باللغة الشامية :) ).

شكراً لك

هذه الجملة خاطئة  :wacko: 


#5

الحمد لله، فرجت بعد أيام

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

وهذه الطريقة:

أولاً - عليك الحصول على مكونات اللون الذي تريد (صبغ) الصورة به، يعني عملية فصل Split لكي تحصل على Red و Green و Blue والطرق لذلك كثيرة، ولكن في النهاية معادلاته هي:

  1.  
  2. Red = Color And &HFF
  3. Green = (Color &H100) And &HFF
  4. Blue = (Color H10000) And &HFF
  5.  
  6.  
  7.  
  8.  

وبهذا حصلت على مكونات اللون.

سوف نستعملها لنحصل على مكونات اللون الذي نريد أن نصبغ الصورة به، ولنحصل على مكونات الـPixel الذي نقوم بصبغه.

ثم نحسب أي المكونات أكبر في اللون الذي نريد أن نصبغ به ، هكذا مثلاً:

  1.  
  2. If Red>=Green Then
  3. If Red>=Blue Then
  4. Max = Red
  5. Else
  6. Max = Blue
  7. End If
  8. Else
  9. If Green>=Blue Then
  10. Max=Green
  11. Else
  12. Max=Blue
  13. End If
  14. End If
  15.  
  16.  
  17.  

والآن نأخذ مكونات الـPixel ونحسب متوسطها:

  1.  
  2. Average = (Red + Green + Blue) / 3
  3.  
  4.  
  5.  

والآن لدينا مركبات اللون، والمركب الأكبر من مركبات اللون، ولدينا مركبات الـPixel ومتوسطها.

نقوم بالعملية التالية:

  1.  
  2. Red = Avearge * ColorRed / Max
  3. Green = Average * ColorGreen / Max
  4. Blue = Average * ColorBlue / Max
  5.  
  6.  
  7.  

وبهذا أصبح لدينا RGB بعد الصبغ، علينا أن نسندها إلى الـPixel الذي نريده.

يمكننا مثلاً استعمال دالة الـAPI وهي SetPixel مثلاً:

  1.  
  2. SetPixel(Picture.HDC,PixelX,PixelY,RGB(Red,Green,Blue))
  3.  
  4.  

وتكرر العملية على كل Pixel في الصورة، باستعمال جملة For مثلاً.

في المرفقات ملفان:

الأول RGB Manager وهو برنامج يوضح كيفية توزع ألوان RGB بطريقة جميلة، قمت ببرمجته على السريع، لذلك قد يكون هناك Bugs .

المرفق الثاني مثال لعملية الصبغ، ليس من برمجتي، هو بالفيجوال بيسك، ولكن المبدأ واحد.

شكراً لكم إخواني.

RGB_Manager.rar

Palette.rar

تم تعديل هذه المشاركة بواسطة Abboodd في 24 يناير 2009 في 18:44

هذه الجملة خاطئة  :wacko: 


#6

مرحباً أخي الكريم عبود .

هل تعلم, بدأت أتشوق لإستخدام هذه اللغة أو بالأحرى هذه النسخة من VB, :S للأسف سرعة قراءة وكتابة Pixel(s) بطئة جداًاًأًاً في .Net !!!, لكن من جديد بدأت أستعمل Lookbits والقراءة والكتابة تتم عبر الـ ( System.Runtime.InteropServices.Marshal ) لكن صدقني ( لم أشعر بذلك الفرق الكبير :( ), أعمل الأن على تقسيم الصورة الى أربعة أجزاء ومعالجتها تحت Threading.Thread ومن ثم عند الإنتهاء من تعديل كل النقاط الضوئية ( Pixels ) أقوم بتجميع الأجزاء الأربعة الى واحدة لتتكون الصورة من جديد :), ليس بعمل سيء :D , وجدت فرقاً بسيط أيضاً, ومازلت ( أحارب كي أجعلها سريعة كالعملية SetMatrix :S ) .

بالتوفيق :) .

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#7

أهلاً وسهلاً أخ بشار.

أنا برأيي أن تظل على .Net ولكن أكثر من استعمال APIs .

حمل المرفق الأول وأخبرني عن رأيك، أنا عملته على السريع، ولكني أفكر في إضافة بعض الأشياء عليه.

هذه الجملة خاطئة  :wacko: 


#8
Abboodd كتب:
أهلاً وسهلاً أخ بشار.

أنا برأيي أن تظل على .Net ولكن أكثر من استعمال APIs .

حمل المرفق الأول وأخبرني عن رأيك، أنا عملته على السريع، ولكني أفكر في إضافة بعض الأشياء عليه.

تقصد Get <> Set < Pixel ?

إذا كان هذا ماتقصده فقط جربته أيضاً, لكن هذا http://www.bobpowell.net/lockingbits.htm أسرع بكثير, المشكلة تكمن في اللغة ذاتها :( .

جربت الملف المرفق ( جميل :) ) لكن إذا أردت نصيحة من أخ فاستعمل ScrollBars لجعل المستخدم يفهم ويختار لون ما بكل سهولة :P, تصور أنه سينتظر حتى يظهر اللون الأبيض :D, بالشامية ( لشهر مابشوفها (

بالتوفيق

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#9

يمكن استعمال Scrolls ولكن هنا كان الهدف الرئيسي هو معرفة كيفية ترتيب الألوان من 0 إلى 16.7 مليون، و هناك نافذة خاصة هي Set RGB يمكنك تحديد الأبيض، يعني ما بدها شهر :).

على كل حال، هذا البرنامج بعد إضافة كماليات عليه.

RGB_Manager.rar

هذه الجملة خاطئة  :wacko: 


#10
Abboodd كتب:
يمكن استعمال Scrolls ولكن هنا كان الهدف الرئيسي هو معرفة كيفية ترتيب الألوان من 0 إلى 16.7 مليون، و هناك نافذة خاصة هي Set RGB يمكنك تحديد الأبيض، يعني ما بدها شهر :) .

على كل حال، هذا البرنامج بعد إضافة كماليات عليه.

RGB_Manager.rar

;) الله يعطيك العافية, صحيح لن يحتاج شهر :P لكن أعرف كيف يفكر المبرمجون أمثالنا :D, عند رؤية الكثير من الأدوات داخل المشروع يقولون ( هيا بنا !!, حان وقت الإكتشاف :D ) .

لا أعلم إن كان لديك ( الوقت والـ .NET Framework v2.0 ) لتجرب مشروعي الأول, هههه, هو عبارة عن مشروع يقدم لك واجهة فيها العديد من الـ Panels والـ TextBoxes وخمسة ScrollBars

ScrollBar لـ :

1 - الفرق بين 255 وأكبر قيمة لإحدا الـ ScrollBars >> ( Max, Alpha, Red, Green, Blue )

2 - Alpha

3 - Red

4 - Green

5 - Blue

وهنالك أيضا PictureBox يعرض للون مدمج من الأسود الى اللون المختار الى الأبيض أي لإختيار مستوى الإضاءة :D .

وأيضا عدة TextBoxes لعرض قيمة اللون في لغات برمجة معرفة >< حوالي 8 لغات على ماأتذكر :( .

سأقوم بالبحث عنه ورفعه لك لتجربه, طبعاً إذا توفرت الشروط المذكورة :P .

بالتوفيق .

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 25 يناير 2009 في 13:15

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#11
اقتباس
لا أعلم إن كان لديك ( الوقت والـ .NET Framework v2.0 )

أنا اشتريت .Net من البحصة لكن الـDVD كان فارغاً :mellow:

سوف أذهب لتبديله الإثنين بإذن الله.

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

السلام عليكم

هذه الجملة خاطئة  :wacko: 


مواضيع مشابهة