Evgenios1 Δημοσ. 19 Φεβρουαρίου 2010 Δημοσ. 19 Φεβρουαρίου 2010 Μπορει να μου εξηγησει κανεις, το πως θα διαβασω εναν bitmap header. Εχω κανει το παρακατω, αλλα... δεν. >// image_mpla.cpp : Defines the entry point for the console application. // #include "stdafx.h" #define BIG_INT(x) ((x>>24) | ((x<<8)&0x00ff0000) | ((x>>8)&0x0000ff00) | (x<<24)) #define BIG_SHORT(x) ((x>>8) | (x<<8)) #define INT_FROM_P(p) *((int*)p) #define SHORT_FROM_P(p) *((short*)p) #define WIN_BMP ((short)'B') | ((short)'M')<<8 int _tmain(int argc, _TCHAR* argv[]) { FILE *fp = fopen("c:\\test\\test_24.bmp","rb"); char *rawHeader = new char [14]; fread(rawHeader,1,14,fp); fclose(fp); if(SHORT_FROM_P(rawHeader) == WIN_BMP) { printf("This is a Windows Bitmap file.\n"); printf("File size:%d\n",BIG_INT(INT_FROM_P(rawHeader+2))); printf("Info struct offset:%d\n",BIG_INT(INT_FROM_P(rawHeader+10))); } getchar(); return 0; }
bxenos Δημοσ. 20 Φεβρουαρίου 2010 Δημοσ. 20 Φεβρουαρίου 2010 >#define BIG_INT(x) ((x>>24) | ((x<<8)&0x00ff0000) | ((x>>8)&0x0000ff00) | (x<<24)) γιατί του γυρνάς τα μέσα-έξω; Είναι έτοιμος ο αριθμός, δεν θέλει μετατροπή. έχεις 3 λάθη μην χρησιμοποιείς signed integers αλλά unsigned όταν κάνεις μετατροπές(οπου έχεις int βάλε unsigned int και όπου short βαλε unsigned short) προσπαθεις να γυρίσεις τον αριθμό ανάποδα χωρις λόγο το μεγαλο σου λάθος που σε μπερδεξε όμως:#define INT_FROM_P(p) *((int*)p)Γιατί όταν δίνεις INT_FROM_P(rawBuffer+2) πρώτα εκτελειται το cast του pointer και μετά το +2, αρα τρέχα γύρευε ποιες διευθύνσεις διαβάζεις...ΠΡΟΣΟΧΗ: o k&r το δηλώνει καθαρά: στα defined μην βασιζόσαστε ότι το όρισμα είναι ένα μονο νούμερο, μπορεί να είναι έκφραση (όπως εδω rawBuffer+2)Η σωστή define είναι#define INT_FROM_P(p) *((unsigned int*) (p)) Ισως να σε βόλευε να το κάνεις πιο απλά να μην σπας και τα νευρα σου > #pragma pack(1) typedef struct __tagBITMAPFILEHEADER { unsigned short bfType; //2bytes unsigned bfSize; //4bytes unsigned short bfReserved1; //2bytes unsigned short bfReserved2; //2bytes unsigned bfOffBits; //4bytes } __BITMAPFILEHEADER; #pragma pack() ...... __BITMAPFILEHEADER *hd = (__BITMAPFILEHEADER *)rawHeader; printf("hd-size=0x%x (%u)\n",hd->bfSize,hd->bfSize); ...ασε που μπορείς να χρησιμοποιήσεις και το έτοιμο BITMAPFILEHEADER των windows sdk:-D Για πληροφορίες εδωhttp://msdn.microsoft.com/en-us/library/aa930979.aspx
Evgenios1 Δημοσ. 20 Φεβρουαρίου 2010 Μέλος Δημοσ. 20 Φεβρουαρίου 2010 Με μπερδεψε η wiki που λεει οτι τα int ειναι litle indian:-( > class Bitmap { PBYTE pRawImage; UINT rawImageSz; BITMAPFILEHEADER BitmapHeader; BITMAPINFOHEADER BitmapInfo; public: Bitmap(UINT h,UINT w,BYTE deep) { } Bitmap(const char* file) { FILE *fp = fopen(file,"rb"); if(fp==NULL) throw "Can't load file"; fread(&BitmapHeader,sizeof(BITMAPFILEHEADER),1,fp); if(memcmp(&BitmapHeader.bfType,"BM",2)) throw "This is not a Windows Bitmap file."; fread(&BitmapInfo,sizeof(BITMAPINFOHEADER),1,fp); pRawImage = new BYTE[bitmapInfo.biSizeImage]; printf("%d",BitmapInfo.biSizeImage); fseek(fp,BitmapHeader.bfOffBits,0); fread(pRawImage,1,BitmapInfo.biSizeImage,fp); fclose(fp); } Bitmap(const _TCHAR* file) { } };
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.