תכנות וזיהוי/תוכנית לזיהוי צבע
מה התוכנה לזיהוי צבע עושה
עריכה- היא מפענחת את צבע צג המחשב (מסך המחשב) במספר נקודות.
- הנקודות נמצאות על אלכסון העובר מהנקודה הימנית עליונה ומגיע לנקודה הימנית תחתונה.
- היא כותבת בפינה השמאלית עליונה את שם הצבע בעברית.
- שם הצבע מוצג בעזרת הדבקת תמונת מפת סיביות עם שם הצבע, בפינה השמאלית עליונה של הצג.
- היא מפסיקה לעבוד רבע שנייה אחת בין כל פיענוח, כדי לתת למשתמש זמן לראות את שם הצבע המפוענח.
- היא מצפצפת 3 צפצופים המתאימים בגובה הצליל ובמשך זמן הצליל לשלושת המרכיבים של צבע הנקודה.
- היא שומרת את 3 המספרים הקובעים את הצבע בקובץ (כל פיענוח נקודה גורם לקובץ להחליף את תוכנו המורכב מ-3 מספרים) .
זה תכנות זה ?!
עריכהמקובל לפרק תוכנה לפונקציות כמה שיותר קטנות, למה נכתבו פונקציות כל כך ארוכות ?
- משום שאם אקטין את הפונקציות לגודלם הקטן ביותר סביר שאכתוב פונקציות שכבר נכתבו
היכן שהוא ויפגעו בזכויות יוצרים של מתכנתים אחרים.
מקובל לכתוב פונקציות עם פקודות כמה שיותר קצרות לדוגמה BitBlt עם המשתנה SRCCOPY,
ולא לכתוב פעמיים BitBlt : פעם עם SRCAND ופעם נוספת עם SRCPAINT !
- שתי סיבות לצורת הכתיבה הזאת:
- לא בטוח ש : BitBlt עם המשתנה SRCCOPY פועל על חלון שולחן העבודה.
- בכתיבת פונקציות קצרות יש לי סיכוי גדול לפגוע בזכויות יוצרים.
זה זיהוי זה ?!
עריכהזיהוי הצבע לא מדויק, ברוב המקרים התשובה היא צבע אפור ,אף על פי שברור למשתמש מה שם הצבע !
- מטרת התוכנה לאתגר את המשתמש לכתוב אלגוריתם יותר מדויק ולא לקבל מה שנכתב כקדוש,
לאלגוריתם לא מדויק כזה קוראים כלל אצבע.
מה יצא למשתמש מזיהוי צבע ? הרי המשתמש מתעניין בתוכנה מעשית !
- מי שהצליח להדר את קבצי התוכנה לזיהוי צבע, קיבל רקע תכנותי שיעזור לו לתכנת את התוכנה
לזיהוי כתב, הנמצאת בפרקים הבאים , שהיא מאוד מעשית.
יצירת תוכנה מהקבצים בספר
עריכהבפרק ו כתוב תוכן של שלשה קבצים :
- קובץ קוד מקור , הקובץ ScreenColor.cpp .
- קובץ הכותרת mmain.h
- קובץ משאבים, הקובץ RRsrc.rc
כדי ליצור את תוכנית הריצה צריך להדר ולקשר ל - 3
הקבצים כמה תמונות מסוג תמונת מפת סיביות .
אבל לפני יצירת הקבצים, פותחים תיקיית קבצים במחשב ,
שם ישמרו התמונות והקבצים מהם תיווצר התוכנית .
צריך להגיע למצב בו הקבצים מוכנים להידור , כלומר שתוכנת המהדר
יודעת מה הקבצים שהיא צריכה לקרא, ומה רק לקשר, ומה תלוי במה.
לשם כך משתמשים בשתי שיטות :
- הוספת שורות קוד בקבצים.
- הקלדת הנחיות במהדר.
הוספת שורות קוד בקבצים לשימוש המהדר
עריכהכך אומרים למהדר שהפונקציות והמשתנים בקובץ מסתמכים על ספריית הפונקציות של חלונות :
#include <windows.h>
כך אומרים למהדר שהפונקציות והמשתנים בקובץ מסתמכים על מה שכתוב בקובץ mmain.h הנמצא בתיקיית הקבצים של הפרויקט :
#include "mmain.h"
שורה כזאת הנמצאת בקובץ מקורות ( RRsrc.rc ), אומרת למהדר לשמור את התמונה( green.bmp ) במִשתנה( green) :
green BITMAP "green.bmp"
כך אומרים למהדר שהקבוע green1 מוגדר וערכו - 1 .
#define green1 1
הידור התוכנית
עריכהמפעילים את המהדר ויוצרים קובץ פרויקט חדש, לדוגמה : " colors ", הוא נשמר בשם colors.dev בתיקייה שפתחתו.
הפרויקט יוצר קובץ ראשי (עם סיומת cpp) באופן אוטומטי.
שלב הבא: מחליפים תוכן של 2 קבצים המוצגים אוטומטית בפרויקט,
עם קבצים המוצגים כאן בהמשך הספר,על ידי הפעולות גזור, העתק והדבק:
- הקובץ הראשי עם תוכן ScreenColor.cpp .
- קובץ המשאבים בקובץ המשאבים RRsrc.rc .
מוסיפים את קובץ הכותרת לפרויקט, על ידי שתי פעולות :
נפתח תפריט המאפשר הוספת קובץ כותרת לפרויקט
אחרי שמוסיפים לתיקייה את קבצי התמונות (כמו שנראה בהמשך) הקבצים מוכנים להידור, וליצירת תוכנית ריצה.
יש שתי אפשרויות ליצור את התמונות בעזרת הצייר החלוני ,כדי לשמור בה את הקבצים החדשים.
- יצירת התמונות לבד .
- העתקה מהתמונה כאן .
יצירת התמונות לבד
עריכהלצייר בצייר החלוני תמונות קטנות של שמות הצבעים ,
ולשמור אותם בתיקיית הקבצים כסוג קובץ מפת סיביות,
עם שמות לטיניים כמו בתמונת קבצי שמות הצבעים בפרק הזה,
שהם השמות המופיעים בקובץ משאבים RRsrc.rc .
העתקת התמונות מכאן
עריכהתופסים את התמונה של תמונת מפת הסיביות המוזכרת בפרק הזה ( קבצי שמות הצבעים ),
ומדביקים אותה בצייר בעזרת פעולות גזור, העתק והדבק כך :
כדי לתפוס את התמונה בספר ,לוחצים בייחד על המקשים :AlT ו- Print-Screen
כדי להדביק את התמונה בצייר, פותחים את הצייר החלוני ומקלידים בייחד על המקשים :Ctrl ו- V
שלב הבא : בוחרים חלק מתוך התמונה המכיל את שם הצבע
שלב הבא : פותחים בצייר החלוני קובץ חדש ומדביקים לתוכו את חלק התמונה שנבחר .
שלב הבא : שמירת מה שהתקבל בתיקיית הקבצים בתור סוג של קובץ : מפת סיביות, עם שמות כמו באפשרות הראשונה.
שליפת צבעים ממספר אחד
עריכההתוכנית מבוססת על פונקציית הספרייה GetPixel שנותנים לה כקלט
מיקום נקודה בצג המחשב, והיא מחזירה מספר שלם המכיל
את 3 מרכיבי הצבע (היא מוסברת בפרק הבא).
כאן אנסה להסביר איך לפרק מספר ארוך לכמה מספרים .
פירוק מספר ארוך ל - 4 מרכיבים
עריכהנניח שיש לנו מספר בשיטה ההקצדסימאלית בעל 4 ספרות ואנו רוצים לדעת מה הספרה ה- 3 שלו,
ואין לנו פונקציה שתשלוף את הספרה השלישית שלו, אבל יש לנו פונקציה שאם היא מקבלת שני מספרים היא הופכת את שניהם לתצוגה בינארית,
והתוצאה של אותה פונקציה היא מספר בו מוכפלות כל הספרות הבינאריות של שני המספרים זו בזו .
בתכנות בשפת CPP קוראים לפונקציה הזאת : & ומשתמשים בה כאילו היא אחת מפעולות החשבון לדוגמה :
2 בתצוגה בינארית = 010 , 4 בתצוגה בינארית = 100 ,כשמפעילים את הפונקציה על שני המספרים הללו מקבלים :
יש מעט אפשרויות להכפלה של שתי ספרות בינאריות זו בזו :
האפשרות | ראשונה | שנייה | שלישית | אחרונה |
---|---|---|---|---|
הספרה הראשונה | 0 | 1 | 0 | 1 |
הספרה השנייה | 1 | 0 | 0 | 1 |
התוצאה | 0 | 0 | 0 | 1 |
דרך אגב הטבלה הזאת מוכרת בלוגיקה כטבלת אמת של "וגם" לשתי טענות,
כאשר 0 פירושו התנאי לא נכון ו- 1 פירושו נכון ,כי רק אם התנאי הראשון נכון וגם השני, כל הדבר נכון.
אולם צריך לשים לב שבשפת CPP כשרוצים לסמן "וגם" בין תנאים משתמשים בסימן - && , "או" לוגי מסומן ב - | ,
"או" בין תנאים מסומן ב - || .
נניח לדוגמה : שהמספר 13C4 , המספר מוצג בשיטה הבינארית בטבלה הבאה :
4 | C | 3 | 1 |
---|---|---|---|
0100 | 1100 | 0011 | 0001 |
ונכפיל אותו בתצוגה הבינארית של המספר הבא : 0F00 , אנו בוחרים
במספר זה כי היכן שספרותיו 0 הספרה בתוצאה תתאפס והיכן שהספרה F
(הספרה אף בבסיס 16 הופכת ל- 1111 בתצוגה בינארית) הספרה תישאר אותה ספרה, ואנו מעונינים
לדעת מה הספרה השלישית. החישוב נמצא בטבלה הבאה :
ספרה 1 | ספרה 2 | ספרה 3 | ספרה 3 | |
---|---|---|---|---|
13C4 | 0100 | 1100 | 0011 | 0001 |
0F00 | 0000 | 0000 | 1111 | 0000 |
תוצאה | 0000 | 0000 | 0011 | 0000 |
עדיין לא הצלחנו למצוא מה ערך הספרה אבל הצלחנו לאפס את על הספרות האחרות
אם נחלק את התוצאה ב - F הספרה תזוז צעד אחד ימינה. לכן בחילוק התוצאה שתי פעמים ב - F
( )נקבל את התוצאה הרצויה - 3 .
אבל זה עדיין לא מאפשר לנו לשלוף את כמות הצבע ממספר גדול, כי בתוכנית, כמות הצבע מוצגת על ידי
שתי ספרות בבסיס -16 .
לדוגמה נניח שאנו רוצים לשלוף את כמות הצבע הכחול מהמספר :4513C43A
לשם כך נאפס את כל הספרות חוץ משתי ספרות הצבע הכחול על ידי הכפלת התצוגה הבינארית של המספר
בתצוגה הבינארית של : 00FF0000 , אחר כך נחלק את התוצאה 4 פעמים ב - F ,
ונקבל את התוצאה הרצויה : 13
ובנוסחה כללית , הפעלת פונקציית סינון הצבע הכחול ממספר שלם - N המכיל את פלט הפונקציה GetPixel:
אפשר לקרא לפונקציה הזאת מסנן צבע, מפני שהיא מסננת צבע כחול מתוך צבע הנקודה.