SetPixel & GetPixel

kurpos2010

New member
SetPixel & GetPixel

אני צריך להשוות בין 2 תמונות גדולות ( אורך מעל 4000 פיקסלים ורוחב מעל 2000 פיקסלים ).
ניסיתי את הפונקציה GetPixel ובשביל התמונה הסופית ( ההבדלים שיצבעו באדום ) השתמשתי בSetPixel.
הפונקציות האלה איטיות בטירוף, אני עובר על התמונה ולוקח לתוכנה יותר מ5 דקות לעבור על כל התמונה.
חיפשתי בגוגל קצת ומצאתי כל מני תחליפים, אחד מן התחליפים unsafe bitmap .. ראיתי בנצ'מקרים מרשימים..
מישהו קצת יכול להסביר לי על השיטה הזאת? למה היא עדיפה? מה היא עושה בעצם?או להפנות אותי ללינקים שמסבירים שם מה כל דבר עושה? כי מהלינקים שביקרתי בהם לא מסבירים כל-כך מה הם עושים שם, ובוא נגיד שפויינטרים זה לא הצד החזק שלי.

תודה מראש.
 

Miki Watts

New member
יש פונקציה שנקראת BitBlt על gdi32.dll

שהמטרה שלה זה להעביר כמות גדולה של פיקסלים.

ראה פה דוגמה:
http://www.java2s.com/Code/CSharp/Windows/BitBlt.htm

אופציה אחרת זה פונקציה שנקראת DrawToBitmap
ראה פה דוגמה:
http://stackoverflow.com/questions/597037/how-to-copy-one-graphics-object-into-another?rq=1

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

kurpos2010

New member
אני צריך לעשות השוואה בין 2 תמונות. לא להעתיק

עדיין אני אצטרך לעשות את הלולאה של הX והY שיקראו את הפיקסלים, פשוט אני אשתמש בbitblt? במקום בgetPixel?

תודה מראש.
 

Miki Watts

New member
הרעיון הוא שתעתיק את התמונה המקורית

למשטח כלשהו בזכרון, תבצע עליה את העיבוד שאתה צריך בזכרון בלבד, ולאחר מכן תעתיק את התוצאה לתמונה אחרת או כל תהליך שהוא שאתה צריך, אבל הרעיון הוא לא להשתמש ב Get/SetPixel
 
You should definitly use unsafe context

Assuming you have some performance constrains, as it'll be orders of magnitude faster. If you don't know how + did not find an example code, let us know.
 

ziv1f

New member
מה ההשוואה שאתה צריך לעשות?

אם ההשוואה היא רק לבדוק ששתי התמונות זהות אחד-לאחד, הרי שאתה יכול בקלות מאד לשמור את התמונות לקובץ ולבצע השוואה בין הקבצים

לגבי השוואות מורכבות יותר, יש אכן צורך בשימוש בפונקציות low level ע"מ להשיג ביצועים סבירים בתמונות בגדלים שתיארת, כאלה שמכילות כשמונה מיליון פיקסלים.

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

בברכה,
זיו
 

kurpos2010

New member
אני צריך לראות את השוני בין 2 התמונות

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

תודה על התגובה.
 

kurpos2010

New member
כמה פיקסלים השתנו *100 לחלק לכמות הפיקסלים

ככה אני יודע את אחוז השינוי של התמונה.. אפשר לעשות את זה אחרת?
 
למעלה