המרת RGB לHex

The Albatross

New member
המרת RGB לHex

שלום לכולם. איך אני יכול להמיר מספרי RGB לקוד Hex? יש איזושהי פונ' שעושה את העניין? ++C.
 

gmorphus

New member
המממ...

אני לא בטוח שאני מבין את השאלה. מה זאת אומרת להמיר לקוד HEX? אתה מתכוון HSB?
 

OriIdan

New member
מה ה INPUT?

אם ה INPUT הוא שלושה מספרים עשרוניים אז פשוט תדפיס אותם עם printf
printf("#%02X%02X%02X", r, g, b);​
תוכנות גרפיקה היום נותנות את המספרים גם בעשרוני וגם ב HEX, כך זה לפחות בתוכנת GIMP ואני חושב שגם בפוטושופ. ואם כבר מדברים על GIMP, היא חופשית אתה יכול להוריד אותה גם ללינוקס וגם לחלונות.
 

The Albatross

New member
אז ככה:

אני רוצה לעשות פונ' שמקבלת או COLORREF או שלושה int עם ערכי RGB, ומחזירה string עם קוד Hex. איך printf עושה את זה? אף פעם לא עבדתי איתה. יש תחלופות?
 

OriIdan

New member
אם זה שלושה ערכי RGB

char *GetHexColor(int r, int, g, int b) { static char str[10]; sprintf(str, "#%02X%02X%02X", r, g, b); return str; }​
יש דרך יותר פשוטה מזה?
 

selalerer

New member
קצת בעייתית הפונקציה שלך ../images/Emo13.gif

מה אם עושים שתי קריאות רצוף? או אפילו באותו printf רחמנה לצלן?
 

OriIdan

New member
צודק

מאחר והפונקציה משתמשת במקום סטטי לאכסון התוצאה, לא ניתן לקרוא לה פעמיים לערכים שונים חייבים להעביר את התוצאה למקום אחר בזכרון. האמת שצריך להוסיף לפונקציה גם בדיקת תקינות של הערכים המועברים אליה. אז פונקציה מעודכנת...
char *GetHexColor(int r, int, g, int b) { static char str[10]; r %= 255; g %= 255; b %= 255; sprintf(str, "#%02X%02X%02X", r, g, b); }​
 

DadleFish

New member
כי הוא צריך "להישאר בחיים"...

...אחרי שהפונקציה מסתיימת. מערך רגיל היה יושב על ה-STACK והיה נעלם עם היציאה מהפונקציה, ולא היית יכול להשתמש בו. מה שאורי הראה פה הוא שיטה אחת מיני כמה להחזרת פונקציה. יש עוד כמה, כמו העברת מצביע בלתי מאותחל, ואז הפונקציה תאלקץ זכרון עליו, והפונקציה הקוראת תצטרך לשחרר את הזכרון; או העברת מצביע מאותחל, ואז הפונקציה פשוט תכתוב אליו (מסוכן - צריך לדאוג שהמצביע יהיה גדול מספיק!).
 

The Albatross

New member
לא מובן.

הפונקציה שולחת את המערך החוצה. אם אני אגדיר את המערך בתור לא סטטי, הפונקציה לא תשחרר את הזיכרון ותקצה אותו מחדש במקום אחר?
 

selalerer

New member
העניין הוא כזה:

להגדיר static בתוך פונקציה זה כמו להגדיר משתנה גלובלי אבל שהגישה אליו היא פרטית לפונקציה שבה הוא מוגדר בלבד. כלומר הוא משתנה גלובלי אבל אם תכתוב את השם שלו מחוץ לפונקציה שבה הגדרת אותו הקומפיילר ייתן לך טעות (שם משתנה לא מוכר). היות ואתה מחזיר את הכתובת שלו אז למעשה כן ניתן להשתמש בו מחוץ לפונקציה, לא בעזרת השם שלו אלא בעזרת מצביע אליו. הבעיה מתעוררת כאשר אתה קורא לפונקציה יותר מפעם אחת ואז היא למעשה כותבת בפעם השניה (או איזשהי פעם אחריה) על אותו זיכרון את התוצאה, והיות ויש לך מצביע אל הזיכרון הזה, אם תנסה להשתמש בתוצאה של הקריאה הקודמת למעשה תקבל את אותה התוצאה בגלל שזה אותו משתנה אפילו אם איכסנת את הכתובת שלו בשני משתנים שונים. קאפיש? אם לא אז זה בגלל שזה לא כזה פשוט למתחיל, תנסה לקרוא קצת על static ולהבין מה זה בדיוק אומר.
 

The Albatross

New member
אז זה רק בגלל שאני מחזיר מצביע.

ואם אני בסוף הפונקציה עושה דבר כזה:
string s = str; return s;​
אני גם צריך שהמערך יהיה סטטי?
 

selalerer

New member
זה בסדר, אבל תוודא שגם הערך

המוחזר של הפונקציה הוא מסוג std::string. בנוסף, זה יהיה טוב אם תבין מה קורה שאתה עושה את זה. בפועל נוצר אובייקט string חדש ועבורו מוקצה זיכרון חדש. האופרטור = מעתיק את התוכן של המערך charים שמוצבע על ידי str אל תוך הזיכרון של האובייקט החדש s (בדומה לstrcpy). אח"כ כשאתה מחזיר את s נוצר אובייקט string נוסף, זמני. ועבורו מופעל הבנאי מעתיק של string כלומר מעתיק את התוכן של s אל תוך האובייקט הזמני שנוצר. כאשר תכתוב את ההשמה מהשם של הפונקציה בקריאה כך:
std::string res=GetHexColor(12,120,255);​
אז המידע יועתק שוב מהאובייקט הזמני אל res בעזרת קריאה לאופרטור = שוב. זה קצת מורכב, אבל זה דברים שטוב להבין מה קורה מאחורי הקלעים.
 

OriIdan

New member
למה static

אם הוא היה מערך רגיל, הוא מוקצה על המחסנית ולכן יעלם לאחר סיום הפונקציה. פתרון אחר הוא לעשות malloc אבל אז הפונקציה שמקבלת את המערך תצטרך לשחרר את המקום.
 
למעלה