קריאת קובץ BITMAP

ilankt

New member
קריאת קובץ BITMAP

אני מנסה לקרוא קובץ BITMAP, ולמלא איזה מערך בצבעים של התמונה, אבל משום מה כשאני מנסה לצייר את זה אני מקבל משהו מעוות של התמונה בgrayscale... הנה הקוד:
Surface *pRetSurface; BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; RGBQUAD *pBits; FILE *pFile=fopen(FileName,"r"); if (!pFile) return NULL; fread(&bmfh,sizeof(bmfh),1,pFile); fread(&bmih,sizeof(bmih),1,pFile); fseek(pFile,bmfh.bfOffBits,SEEK_CUR); pBits=new RGBQUAD[bmih.biWidth*bmih.biHeight]; fread(pBits,sizeof(RGBQUAD),bmih.biWidth*bmih.biHeight,pFile); pRetSurface=new Surface(bmih.biWidth,bmih.biHeight); for (long i=0;i<bmih.biWidth*bmih.biHeight;i++) { BYTE R,G,B; R=pBits.rgbRed; G=pBits.rgbGreen; B=pBits.rgbBlue; pRetSurface->m_pBuffer=rgb(R,G,B); }

Surface זה בעיקרון רק מחלקה עם מערך של wordים, ואורך וגובה התמונה... הפונקציה rgb מקבלת שלושה בייטים ומחזירה word, בקיצור הופכת צבע של 24bit לצבע של 16bit. הקוד של rgb:
WORD rgb(BYTE r,BYTE g,BYTE b) { return (WORD) (r & 0xff) << 11 | (g & 0xff) << 6 | (b & 0xff); }​
בתודה מראש.
 

OriIdan

New member
פתיחה בינארית

אני מבין שאתה עובד עם windows אז שם יש הבדל בין פתיחה עם מוד של r שזה בברירת מחדל מוד טקסט לעומת פתיחה עם rb ז"א שפונקצית fopen צריכה להיות: fopen(FileName, "rb");
 

ilankt

New member
זה לא עקרוני...

אני מקבל את כל המידע טוב... כנראה יש לי בעיה או בקריאה של הפיקסלים, או באיך שאני שם אותם ב Surface.
 

ilankt

New member
מה אף אחד לא יודע?

אני חושב שהבעיה היא שההמרה של הפיסקלים לא טובה, או שאני לא קורא את הפיקסלים טוב... בבקשה?
 

DadleFish

New member
אני יודע שב-CODE GURU

יש כמה וכמה דוגמאות לקריאת BMP-ים. אולי תבדוק שם?
 

ilankt

New member
כי

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

david o

New member
חיפוש בגוגל

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

ilankt

New member
קבלו ביטול הצלחתי

אם זה מעניין מישהו הנה כל הפונקציה:
Surface *Display::CreateSurfaceFromFile(const char *FileName) { Surface *pRetSurface; BYTE *pBits; BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; FILE *pFile=fopen(FileName,"rb"); if (!pFile) return NULL; fread(&bmfh,sizeof(bmfh),1,pFile); fread(&bmih,sizeof(bmih),1,pFile); fseek(pFile,bmfh.bfOffBits,SEEK_SET); long len=bmfh.bfSize-sizeof(bmfh)-sizeof(bmih); pBits=new BYTE[len]; fread(pBits,len,1,pFile); pRetSurface=new Surface(bmih.biWidth,bmih.biHeight); long i=0; for (long y=bmih.biHeight-1;y>=0;y--) { for (long x=0;x<bmih.biWidth;x++) { BYTE R,G,B; B=pBits; i++; G=pBits; i++; R=pBits; i++; pRetSurface->SetPixel(x,y,rgb(R,G,B)); } i+=2; } delete[] pBits; fclose(pFile); return pRetSurface; }
 
למעלה