Bitmap richtig einlesen und umspeichern
-
Hi,
leider habe ich noch nichts passendes gefunden. Mein Problem ist, das ich einen Bitmap einlesen will und die Werte dann in ein Array der struct Pixel speichern will.
Die struct
typedef struct Pixel { unsigned short value1; unsigned short value2; unsigned short value3; } Pixel;
Meine derzeitige Einlesen und rüberspeichern Methode. MapImage ist vom Typ short.
bool CBitmap::LoadBitmap(char* Filename) { HANDLE hDatei; BITMAPFILEHEADER BMPFileHead; BITMAPINFOHEADER BMPFileInfo; DWORD dwLeseSpeicher; int k = 0; int MapSizeX, MapSizeY; hDatei = CreateFile(Filename, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if (hDatei == INVALID_HANDLE_VALUE) return FALSE; if (!ReadFile(hDatei, &BMPFileHead, sizeof(BMPFileHead),&dwLeseSpeicher, NULL)) { CloseHandle(hDatei); return FALSE; } if (!ReadFile(hDatei, &BMPFileInfo, sizeof(BMPFileInfo), &dwLeseSpeicher, NULL)) { CloseHandle(hDatei); return FALSE; } MapSizeX = BMPFileInfo.biWidth; MapSizeY = BMPFileInfo.biHeight; if ((MapSizeX != BITMAP_WIDTH) || (MapSizeY != BITMAP_HEIGHT)) return false; MapImage = (short *)malloc(MapSizeX * MapSizeY * 3); if (!ReadFile(hDatei, MapImage, MapSizeX*MapSizeY*3, &dwLeseSpeicher, NULL)) { CloseHandle(hDatei); return FALSE; } for(int i = 0; i <= BITMAP_HEIGHT; i++) { for(int j = 0; j <= BITMAP_WIDTH; j++) { if((j==0)&&(i==0)) { k = j + i; } else { k = j + i + 3; } this->PixelRGB[j][i].value3 = MapImage[k]; this->PixelRGB[j][i].value2 = MapImage[k+1]; this->PixelRGB[j][i].value1 = MapImage[k+2]; } } delete MapImage; CloseHandle(hDatei); return true; }
Wenn ich mit dieser Methode einlese erhalte ich aus dem Bitmapwerte im tausender Bereich pro Pixel.
So long
Tobias
God bless you
-
öhm mal davon abgesehen das du die datei nicht gerade in ANSI-C/C++ öffnest (*böses CreateFile*
)...
was ist jetzt dein genaues problem... du brauchst eigentlich nur den header einmal definieren und dann komplett einlesen... (in ein struct...) dann musst du gucken ob es ein 24 bit farbbild ist, wenn nein kommt noch ne farbtablelle die die rauslesen musst und danach kannst du pixel für pixel in dein array einlesen... in ein extra pixelstrukt würde ich das nicht packen, baller die pixel einfach in ein integer (das sollten in den meisten fällen 24 bit abdecken...) drauf zugreifen kannst du auf die RGB werte indem du einfach die bits hin und hershiftest und verundest...
ach so nochwas, die zeilen sind im bitmap vertauscht... soll heissen die y-werte gehen nicht von oben nach unten sondern von unten nach oben (merkst du aber spätenstens wenn dein bild auf einmal auf den kopf liegt) und du musst beim einlesen drauf achten das dein bild eine durch 4 teilbare zeilenlänge hat.. wenn nicht füllt der am ende immer noch auf eine durch 4 teilbare zahl mit nullen auf
-
uiuiui das riecht stark nach winapi und solche späße...vielleicht mal dort fragen oder noch besser im graphik-forum. ich kenne mich zwar nicht so aus, aber sind bitmaps nicht graphiken ?
-
@ethereal
es ist nicht nötig das bitmap mit der WinApi zu bearbeiten... kann man alles in ansi-c/c++ machen... lediglich zum anzeigen muss man dann ausbrechen aber eine klasse die das bitmap einlädt und es ggf bearbeitet geht auch völlig losgelöst von WinApi und Co...