תכנות וזיהוי/קבצי המקור לתוכנית לזיהוי צבע

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

ScreenColor.cpp הקובץ[עריכה]

 
/*
שם הקובץ:  ScreenColor.cpp
צייר קו אלכסוני שחור על
על צג המחשב חלקים, חלקים בהפסקות
לכל נקודה שהגעת כתוב את צבעה
בפינה השמלית עליונה של המסך 
*/
 
#include <windows.h> 
// הספרייה הזאת מייבאת
// פונקציות חלוניות וקבועים
#include <stdlib.h> 
//  _sleep לייבא את פונקציית השהיית התוכנית 
#include <stdio.h>  
// ליבא פונקציות העוסקות בקבצים
#include "mmain.h"  
// ליבא קבועים שהוגדרו על ידי התכנת 
// שישובצו בתוכנית זאת
 
HBITMAP hbmMain;    //מצביע כדי להגדיר תמונת מפת סיביות
FILE *fopen(),*fp; //מצביעים שיגדירו קבצי מלל
 
 
/*
הפונקציה : BdokTseva
תאור :
בדוק בעזרת 3 מרכיבי הצבע
של שתי נקודות שונות האם
הצבעים  שווים.
אם ההפרש  בין כל מרכיב
של צבע בשני הצבעים קטן ממספר קבוע מסוים
אזי שני הצבעים שווים.
*/
 
int BdokTseva(int MyRed,int MyGreen ,int MyBlue,
              int rColor,int gColor,int bColor  )
{
     if (( AbsDelta(rColor,MyRed) < Kavua )&&
         ( AbsDelta(gColor,MyGreen) < Kavua ) &&
         ( AbsDelta(bColor,MyBlue) < Kavua ) ) return 1;
     else
     return 0 ;
}
 
/*
הפונקציה  MyPixelColor
תיאור:
מצא את בהירות הנקודה
לשם כך טען את מהמשתנה
MyColorf
שהוא מטיפוס נתונים
COLORREF
בעזרת פונקציית הספרייה
GetPixel
בנתונים על הצבע .
אחר כך  תפרק את המספר
שקיבלת כך שתמצא בו
את כמות האדום הכחול והירוק.
MyColorf
מורכב בצורה כזאת :
שתי הספרות הראשונות מכילות את כמות הצבע האדום
שתי הספרות הבאות מכילות כמות הצבע הירוק.
שתי הספרות הבאות מכילות את כמות הצבע הכחול.
שתי הספרות הבאות אומרות לנו אם דגמנו צבע מהחלון
או שמע המיקום שניתן הוא מחוץ לחלון 
הערה :
מבנה כזה של צבע מתאים
לגרסאות ישנות של חלונות
מומלץ לשנות את התוכנית
כך שתתאים לגרסת חלונות חדשה.
*/

int MyPixelColor(HDC Myhdc,
                 int ScreenLocateX,
                 int ScreenLocateY)
{
   COLORREF myColorf;
   // (r,g,b)==(אדום,ירוק,כחול)
   int r, g, b ,InImeg;
   int  output;
 
   myColorf = GetPixel(Myhdc, ScreenLocateX ,ScreenLocateY);
   r =  myColorf &  RedMask  ;
   g = ( myColorf &  GreenMask )/DuBites ;
   b = ( myColorf &  BlueMask )/ QuBites;
   InImeg = ( myColorf &  InMask )/ SeBites;
   Beep(r,r); //  צפצף על פי המרכיב האדום של הצבע
   Beep(g,g); // צפצף על פי המרכיב הירוק של הצבע÷
   Beep(b,b); //צפצף על פי המרכיב הכחול של הצבע

  //שמור את מרכיבי הצבע בקובץ טקסט.
  fp = fopen(ColorFile,"w");
     fprintf(fp," red %3d   green %3d   blue %3d    ",
                r,   g,     b);
            if(fp) fclose(fp);
 
   output = gray1 ; //אם לא מצאתי צבע מתאים נחזיר ערך אפור.
   if ( InImeg > 0 )  return out1 ; //
 //השווה את מרכיבי הצבע
   //עם צבעים ידועים
   if (BdokTseva(79,240,55,r,g,b)) return green1 ;
   if (BdokTseva(27,241,37,r,g,b)) return green1 ;
   if (BdokTseva(0,255,255,r,g,b)) return green1 ;
   if (BdokTseva(0,255,128,r,g,b)) return green1 ;
   if (BdokTseva(46,194,150,r,g,b)) return green1 ;
   if (BdokTseva(0,128,128,r,g,b)) return green1 ;
   if (BdokTseva(9,81,85,r,g,b)) return gray1 ;
   if (BdokTseva(192,192,192,r,g,b)) return gray1 ;
   if (BdokTseva(216,216,216,r,g,b)) return gray1 ;
   if (BdokTseva(128,128,128,r,g,b)) return gray1 ;
   if (BdokTseva(0,0,0,r,g,b)) return black1 ;
   if (BdokTseva(31,32,0,r,g,b)) return black1 ;
   if (BdokTseva(64,0,64,r,g,b)) return black1 ;
   if (BdokTseva(0,0,64,r,g,b)) return black1 ;
   if (BdokTseva(255,255,244,r,g,b)) return white1 ;
   if (BdokTseva(100,150,230,r,g,b)) return blue1;
   if (BdokTseva(166,166,255,r,g,b)) return skyblue1 ;
   if (BdokTseva(103,177,233,r,g,b)) return skyblue1 ;
   if (BdokTseva(128,0,128,r,g,b)) return violet1 ;
   if (BdokTseva(255,0,128,r,g,b)) return violet1 ;
   if (BdokTseva(255,255,0,r,g,b)) return yellow1 ;
   if (BdokTseva(239,249,51,r,g,b)) return yellow1 ;
   if (BdokTseva(255,255,170,r,g,b)) return yellow1 ;
   if (BdokTseva(255,0,128,r,g,b)) return bpurple1 ;
   if (BdokTseva(128,128,64,r,g,b)) return khaki1 ;
   if (BdokTseva(128,128,0,r,g,b)) return brown1 ;
   if (BdokTseva(128,0,0,r,g,b)) return brown1 ;
   if (BdokTseva(255,128,128,r,g,b)) return pink1;
   if (BdokTseva(235,176,152,r,g,b)) return pink1 ;
   if (BdokTseva(236,184,64,r,g,b)) return orange1;
   if (BdokTseva(255,128,0,r,g,b)) return orange1 ;
   if (BdokTseva(164,84,184,r,g,b)) return purple1 ;
   if (BdokTseva(90,0,90,r,g,b)) return purple1 ;
   if (BdokTseva(90,60,90,r,g,b)) return purple1 ;
 
  return output ;
}
 
 
/*הפונקציה : BuildBMP
תיאור
על פי המספר הסידורי של הצבע
הוצא את תמונת מפת הסיביות שמראה את שם הצבע
בנה אותה בפינה השמאלית עליונה של מסך המחשב */
void BuildBMP(HDC hdc,HINSTANCE Hi, int  NumbColor )
{
   HDC hdcMemory;
  HBITMAP hbmMain  ;
BITMAP b;
 
   switch (NumbColor)
    {
       case green1:
            hbmMain = LoadBitmap( Hi, "green");
            break;
       case gray1:
            hbmMain = LoadBitmap( Hi, "gray");
            break;
       case blue1:
            hbmMain = LoadBitmap( Hi, "blue");
            break;
       case black1:
            hbmMain = LoadBitmap( Hi, "black");
            break;
       case red1:
            hbmMain = LoadBitmap(Hi, "red");
            break;
       case white1:
            hbmMain = LoadBitmap( Hi, "white");
            break;
      case skyblue1:
            hbmMain = LoadBitmap( Hi, "skyblue");
            break;
       case violet1:
            hbmMain = LoadBitmap( Hi, "violet");
            break;
       case yellow1:
            hbmMain = LoadBitmap( Hi, "yellow");
            break;
       case bpurple1:
            hbmMain = LoadBitmap( Hi, "bpurple");
            break;
       case khaki1:
            hbmMain = LoadBitmap(Hi, "khaki");
            break;
       case brown1:
            hbmMain = LoadBitmap( Hi, "brown");
            break;
      case pink1:
            hbmMain = LoadBitmap( Hi, "pink");
            break;
       case orange1:
            hbmMain = LoadBitmap( Hi, "orange");
            break;
       case purple1:
            hbmMain = LoadBitmap( Hi, "purple");
            break;
       case out1:
            hbmMain = LoadBitmap( Hi, "out");
            break;
     }
 
  // צור בזיכרון משתנה המתאים לחלק הגרפי של החלון
    hdcMemory = CreateCompatibleDC(hdc);

// צור  בעזרתו תמונת מפת סיביות מתאימה לחלון 
 SelectObject(hdcMemory, hbmMain);
GetObject(hdcMemory, sizeof(BITMAP), &b);

// הראה את התמונה עם שם הצבע
 // בפינה השמאלית עליונה של שולחן העבודה
  BitBlt(hdc,0,0,b.bmHeight,b.bmWidth,
          hdcMemory, 0, 0, SRCAND);
  BitBlt(hdc,0,0,b.bmHeight,b.bmWidth,    
 hdcMemory,0,0,SRCPAINT);
// שחרר זיכרון
  DeleteDC(hdcMemory);
}
 
/*
הפונקציה WinMain 
הפונקציה הראשית של הפרויקט
תיאור
תפוס את התמונה בחלון שולחן העבודה
כולל כל החלונות הנלווים
נסה לדגום עד 100 נקודות
על האלכסון של החלון
האלכסון המתחיל בפינה
השמאלית עליונה של המסך
צייר קו ישר שחור
בין כל שתי נקודות נדגמות
צור הפסקה של רבע שנייה
בין כל דגימה .*/
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
   HWND hwnd;
   HDC  MyHdc ,hdcWindow;
   int Colorr ,mone ,ezer ;
   int MyNum;
int WinHeight ,WinWidth;
RECT r;

// מציאת גובה ורוחב של שולחן העבודה
 GetWindowRect(HWND_DESKTOP,&r);
 WinHeight =r.bottom - r.top;
 WinWidth =r.right - r.left;

 // יצירת חלון מנוון
 hwnd = CreateWindowEx(
      WS_EX_CLIENTEDGE,
      "MyWindowClass" ,
      " זיהוי צבע ",
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, CW_USEDEFAULT,
     WinHeight,WinWidth,
      NULL, NULL, hInstance, NULL);

 // תפוס את החלק הגרפי של החלון במשתנה
 hdcWindow = GetDC(hwnd);

// צור לולאה, צא ממנה אם עברת את מספר
// הנקודות הנדגמות משולחן העבודה
// או אם יצאת משטח שולחן העבודה
 for (ezer = 0;
      Colorr!=out1 && ezer <NumJumps;
      ezer ++)
   {
   mone = ezer *ScaleJumpWith;

   // תפוס את כל החלונות על שולחן העבודה
    // כך שיראו כתמונה אחת
     MyHdc = GetDCEx(
      hwnd,NULL,
      DCX_PARENTCLIP|
DCX_EXCLUDERGN);

// תפוס את צבע הנקודה הנדגמת
     Colorr = MyPixelColor(MyHdc,mone,mone);
// עצור לרבע שנייה לאפשר למשתמש לראות את הנקודה הנדגמת
  _sleep(Second/4);

// צור תמונה עם שם הצבע בפינה השמאלית עליונה של המסך
 BuildBMP(hdcWindow,hInstance, Colorr );

// צור קו ישר לכיוון הנקודה הנדגמת
  LineTo(MyHdc,mone,mone);
  } ;
// שחרר זיכרון
  ReleaseDC(hwnd,MyHdc);
  ReleaseDC(hwnd,hdcWindow);

// נקה מסך
  ChangeDisplaySettingsA(NULL,0);
       return 0;
}

הקובץ mmain.h[עריכה]

/* שם הקובץ:        mmain.h
תאור
קובץ כותרת המכיל קבועים והסברים
לשם התוכנית לזיהוי צבע
 */

/*הגדרת קבוע המתאר שם קובץ טקסט שישמש לשמירת 3 מרכיבי צבע הנקודה  */
#define ColorFile "ColorFile.txt"

/*הגדרת קבוע השגיאה המותרת בזיהוי הצבע
אם המרכיבים של הנקודה שונים ביותר מהקבוע הזה אז זה לא אותו הצבע */
#define Kavua 30

/*כאן אני מגדיר את פונקציית הערך המוחלט
היא נותנת לנו את ההפרש בין שני מספרים בצורת מספר חיובי
ההגדרה של c = AbsDelta(a,b) 
:היא 
אם a > b    אז  c = a - b  
אם a < b    אז  c = b - a  
אם a = b    אז  c = 0      
הפונקציה הזאת עוזרת לנו לקבץ את כל הצבעים לקבוצה קטנה.
כי אם אנו משווים את 3 מרכיבי הצבע בין שני צבעים ומוצאים
ש - 3 המרכיבים בכל צבע לא שונים יותר מקבוע מסוים
אפשר להסיק ששני הצבעים הם מופעים שונים של אותו  צבע
*/
#define AbsDelta(a,b) (((a)<(b)) ? (b-a):(a-b))

/*
הקבועים הבאים עוזרים לנו לחלק את המשתנה
 pixelcolor 
לאדום ירוק וכחול ולמרכיב רביעי
המרכיב הרביעי אומר לנו אם הנקודה
(המכילה את הצבע הזה) היא בתוך החלון הנדגם
*/
#define RedMask   0x000000FF
#define GreenMask 0x0000FF00
#define BlueMask  0x00FF0000
#define InMask 0xFF000000
#define DuBites 0xFF
#define QuBites 0xFFFF
#define SeBites 0xFFFFFF


/* מספר סידורי לצבעים */
#define green1  1
#define gray1   2
#define blue1   3
#define black1  4
#define red1    5
#define white1  6
#define out1    7
#define skyblue1  8
#define violet1   9
#define yellow1   10
#define bpurple1  11
#define khaki1    12
#define brown1  13
#define pink1    14
#define orange1  15
#define purple1    16


/*מספר הדגימות  ומרחק בין דגימה לדגימה */
#define NumJumps 50
#define ScaleJumpWith 10
/* קבוע העוזר לנו לקבוע את אורך הזמן 
בין דגימה לדגימה 
1 דקה == 1000 אלפיות שנייה */
#define Second 1000

הקובץ RRsrc.rc[עריכה]

/*      RRsrc.rc : שם הקובץ
: תאור
הקובץ מלמד את המהדר מה הוא השם של קובצי התמונה
.הנמצאים בתיקיית הקבצים של הפרויקט
המהדר שומר העתק שלהם בקובץ הריצה
כך שבזמן הריצה נוכל לשלוף אותם על פי
השם שהוגדר בקובץ
mmain.h
  */

#include <windows.h>
#include "mmain.h"

green BITMAP "green.bmp"
gray BITMAP "gray.bmp"
blue BITMAP "blue.bmp"
black BITMAP "black.bmp"
red BITMAP "red.bmp"
out BITMAP "out.bmp"
white BITMAP "white.bmp"
skyblue BITMAP "skyblue.bmp"
violet BITMAP "violet.bmp"
yellow BITMAP "yellow.bmp"
bpurpule BITMAP "bpurpule.bmp"
khaki BITMAP "khaki.bmp"
brown BITMAP "brown.bmp"
pink BITMAP "pink.bmp"
orange BITMAP "orange.bmp"