שאלה...

yair24

Member
שאלה...

שלום אני מעוניין לכתוב תוכנית בVISUAL C++ שמסוגלת לפתוח תמונות בפורמט GIF,BMP,JPG ולאחר שפתחה אותם היא שואלת את המשתמש לאיזה רוחב הוא רוצה לשנות את התמונה ואז היא משנה אוטומטית את אורך התמונה לאורך פרופורציוני לרוחב שהמשתמש כתב ומסוגלת לשמור את התמונה בגודל החדש שלה זה בכלל אפשרי? או שאני צריך לדעת בשביל זה אלגוריתמים בעיבוד תמונה... יאיר צוות "המפתח לבית הספר"
 

TsifTsif

New member
דווקא יש...

אז ככה. אני מניח לצורך התשובה שאת פורמט הקבצים אתה מכיר (למשל אם קיבלת bmp, כידוע יכולים להיות לו כל מיני פורמטים. אני מניח שאתה מכיר את הקבצים שלך, כי אתה ערכת אותם או שפתחת אותם ב-photoshop או כל תכנה אחרת ובדקת. ) נניח לצורך הדוגמא שאנחנו עובדים על bmp בפורמט R8G8B8 (יעני, byte אחד לכל צבע, 3 לכל פיקסל. נניח שאין alpha - התרשמתי שאתה לא עובד אם זה). אז מה שאתה צריך לעשות זה לפתוח את הקובץ ככל קובץ רגיל עם פונקציות רגילות של c/c++ ולרוץ ולקרוא את הנתונים לבאפר שהצתה דינמית. למשל משהוא בסגנון: BYTE BmpPixels[100][100][3 ] שזה מציין 100 על 100 פיקסלים, כ"א 3 בתים. עכשיו תרוץ על הקובץ ותקרא את הנתונים. מכאן והלאה תציג אותם כאוות נפשך (אם תעשה מכל פיקסל 4 פיקסלים תקבל תמונה גדולה פי 4. צייר לך את זה על דף ותראה שזה די ברור). אני מניח שלהציג פיקסלים )SetPixel) אתה יודע. תוציא דיאלוגים, תשנה לפי מה שהמשתמש מבקש וכו´, בסוף תשמור על ידי כתיבה רגילה לקובץ עם פונקציות c/c++. שים לב: ב-API נטו זה קצת מעצבן. אם יש לך זמן, תלמד קצת DirectDraw או הכי הכי טוב Direct3D, והסתדרת. שם תוכל לעשות מה שאתה רוצה... ושם גם פותרים עוד בעיות כמו pitch, שלא דיברתי עליהן כאן. מומלץ....
 

yair24

Member
רגע רגע...

אם אני מגדיל תמונה כמו שאמרת (פיקסל אחד הופך ל-4 פיקסלים על מנת להגדיל פי 4) אז אמנם אני אגדיל את התמונה אבל זה יראה לא טוב לא יוכלו לזהות את התמונה... אני אסביר לך למה אני רוצה לכתוב את התוכנה הזאת: אני בונה אתרים כתחביב, ואני משתמש בתוכנות הכי פשוטות על מנת לבנות אותם כלומר בNOTEPAD ובצייר. כל דבר שאני רוצה לעשות אני מצליח לעשות במהירות ממש גבוהה ולכן אני לא רואה צורך להשתמש בכל התוכנות לבניית אתרים למיניהם כי אני מעדיף את הNOTEPAD שנותן לי קוד כמו שאני כותב ולא קוד שמחשב מייצר (כמו הקוד של FRONTPAGE למשל). רק דבר אחד לוקח לי המון זמן (יחסית) לעשות, וזה לשנות פרופורציות לתמונה. איך אני עושה דבר כזה? ככה: לוקח את התמונה מכניס אותה לתג IMG ומשנה לה רק את האורך, האקספלורר משנה לי לבד את הרוחב בצורה פרופורציונית והוא עושה את זה לא רק בכלל כלומר הוא ממש לא הורס את איכות התמונה, אבל ככה להשאיר את זה זה לא חכמה, כי אז נוצר מצב שיש לך תמונה קטנה בגודל אבל גדולה במשקל שלה (מבחינת בתים) לכן מה שאני עושה בשלב זה זה לוחץ על המקש PRINTSCREEN ומכניס את זה לצייר, בצייר אני חותך את התמונה ושומר אותה מחדש כתמונה חדשה קטנה. כל התהליך הזה לוקח לי משהו כמו חצי דקה לתמונה שזה הרבה לכן חשבתי לכתוב תוכנית שעושה את זה יותר מהר. והשיטה שנתת לי כאן היא לא טובה למטרה הזו. מה שכן דיברת על DIRECT3D אתה יכול לפרט יותר אולי באמצעות זה יש פיתרון אחר? תודה יאיר "צוות המפתח לבית הספר"
 

TZURYOAV

New member
WWW.CODETOOLS.COM

בSECTION על BITMAPS תמצא קודים שעושים חידוד לתמונה יואבי
 
למעלה