From: Great One (suda_j@iol.cz)
Date: Sat 27 Nov 1999 - 02:35:53 IST
Hi Sorry if this is out of topic or too long, but: I'm trying to use BMP files under Linux. So far I've been using them under WIN32 API and I want to rewrite my code for Linux. Under win32 I had: BOOL SPicture::LoadBitmap(LPSTR lpstrfn) { HANDLE hfile; DWORD br; hfile = CreateFile(lpstrfn, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL); if(hfile == INVALID_HANDLE_VALUE) return FALSE; ReadFile(hfile, &bfh, sizeof(bfh), &br, NULL); h_bi = GlobalAlloc(GHND, sizeof(BITMAPINFO)); if(h_bi == NULL) return FALSE; p_bi = (LPBITMAPINFO) GlobalLock(h_bi); ReadFile(hfile, &p_bi -> bmiHeader, sizeof(BITMAPINFOHEADER), &br, NULL); if(p_bi -> bmiHeader.biBitCount != 24) return FALSE; h_data = GlobalAlloc(GHND, sizeof(BYTE) * 3 * p_bi -> bmiHeader.biWidth * p_bi -> bmiHeader.biHeight + sizeof(BYTE) * 3 * p_bi -> bmiHeader.biWidth); if(h_data == NULL) return FALSE; p_data = (BYTE*) GlobalLock(h_data); SetFilePointer(hfile, bfh.bfOffBits , NULL, FILE_BEGIN); ReadFile(hfile, p_data, sizeof(BYTE) * 3 * p_bi -> bmiHeader.biWidth * p_bi -> bmiHeader.biHeight + sizeof(BYTE) * 3 * p_bi -> bmiHeader.biWidth, &br, NULL); CloseHandle(hfile); return TRUE; } This is a very specific function for loading truecolor bitmaps. This function uses: BITMAPFILEHEADER bfh; // bitmap file header HGLOBAL h_bi; LPBITMAPIFNO p_bi; // bitmap info HGLOBAL h_data; BYTE* p_data; // bitmap's data WIN32 API definitions of these structures are: typedef struct tagBITMAPFILEHEADER { // bmfh WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER{ // bmih DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; typedef struct tagRGBQUAD { // rgbq BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; typedef struct tagBITMAPINFO { // bmi BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; I made my own under Linux: ---------------------------------------------------------------------------- ----- #define BYTE unsigned char #define DWORD unsigned int #define LONG int #define UINT unsigned int #define WORD unsigned short int #define LPSTR char* #define BOOL int #define FALSE 0 #define TRUE 1 // MS-Windows bitmaps' definition: typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; #define LPBITMAPFILEHEADER BITMAPFILEHEADER* #define LPBITMAPINFOHEADER BITMAPINFOHEADER* #define LPBITMAPINFO BITMAPINFO* And my code under Linux: BOOL SPicture::LoadBitmap(LPSTR lpstrfn) { FILE* hfile; hfile = fopen(lpstrfn, "rb"); if(hfile == NULL) return FALSE; fread(&bfh, sizeof(bfh), 1, hfile); p_bi = (LPBITMAPINFO) malloc(sizeof(BITMAPINFO)); if(p_bi == NULL) return FALSE; fread(&p_bi -> bmiHeader, sizeof(BITMAPINFOHEADER), 1, hfile); if(p_bi -> bmiHeader.biBitCount != 24) return FALSE; p_data = (BYTE*) malloc(sizeof(BYTE) * 3 * p_bi -> bmiHeader.biWidth * p_bi -> bmiHeader.biHeight); if(p_data == NULL) return FALSE; fseek(hfile, bfh.bfOffBits, SEEK_SET); fread(p_data, sizeof(BYTE), 3 * p_bi -> bmiHeader.biWidth * p_bi -> bmiHeader.biHeight, hfile); fclose(hfile); return TRUE; } I'm using g++. The program runs but the values in bfh and p_bi are absolutely crazy. Nosense. Did I do anything wrong ? Answer anybody, please. Thank you.
This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:22 IST