Προς το περιεχόμενο

Bitmap header


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Μπορει να μου εξηγησει κανεις, το πως θα διαβασω εναν 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;
}

Δημοσ.

>#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

Δημοσ.

Με μπερδεψε η wiki που λεει οτι τα int ειναι litle indian:-(

 

 

:D

>
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)
{
}
};

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...