Bitmap einlesen
-
Hallo,
ich hab von diesem Thema schon viele Posts gelesen, doch keines hat mir weitergeholfgen, desshalb mache ich einen neuen auf.
Ich möchte ein Bitmap in eine Matrix einlesen, aber irgentetwas muss ich falsch machen, denn das eingelesene Bild ist verschoben.
Ursprungsbild:
|----------|Hallo Bild nach dem Einlesen
|----------|
lloHa Komplette Teile des Bildes werden verschoben.
Hier mein Code:
ifstream testsize("c:\\jan24.bmp", ios::ate); if(testsize.is_open()) { BYTE * Pic = new BYTE[testsize.tellg()]; testsize.close(); ifstream s; BITMAPFILEHEADER *h1; BITMAPINFOHEADER *h2; int i = 0; s.open("c:\\jan24.bmp"); if(s.is_open() ) { i = 0; //datei in array schreiben while(! s.eof()) Pic[i++] = s.get(); h1 = ( BITMAPFILEHEADER *) Pic; h2 = ( BITMAPINFOHEADER *) (Pic + sizeof(BITMAPFILEHEADER)); int x = 0, y = h2->biHeight; for(int j = h1->bfOffBits + sizeof(BITMAPFILEHEADER); j < i; j += (h2->biBitCount/8)) { if(j % h2->biWidth == 0) // neue Zeile? { x = 0; y--; } else x++; //Zum testen die punkte ausgeben pDC->SetPixel(x,y, Pic[j]); } } }Was mache ich falsch?
Gruß Stu
-
Erstmal ist es nicht nötig, das File zwischendurch wieder zu schließen und neu zu öffnen - du kannst auch einfach mit seekg(0) an den Dateianfang springen.
Und zweitens berechnest du den Start des Bildbereiches falsch - 'h1->bfOffBits' ist bereits der Index des ersten Pixels
MSDN schrieb:
bfOffBits
Specifies the offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.(das bewirkt eine Verschiebung deines Bildes um *rechnet* ca. 14 Byte)
-
ah vielen dank, ich hab zwar noch eine verschiebung, aber die ist deutlich kleiner. Jetz wo ich weiß woran es liegt, werd ich es schon richtig schaffen.
-
ich bin nochmal

das Bilder einlesen klappt ziehlich gut. Ich Benutze folgenden Algorythmus:
ifstream bitmap("c:\\t.bmp", ios::ate); BYTE* Pic; if(bitmap.is_open()) { Pic = new BYTE[bitmap.tellg()]; bitmap.seekg(0); BITMAPFILEHEADER *h1; BITMAPINFOHEADER *h2; int i = 0; i = 0; //datei in array schreiben while(! bitmap.eof()) Pic[i++] = bitmap.get(); h1 = ( BITMAPFILEHEADER *) Pic; h2 = ( BITMAPINFOHEADER *) (Pic + sizeof(BITMAPFILEHEADER)); DWORD col; if(h2->biBitCount == 24) //nur 16bit bitmaps lesen for(int b = 0,c = h2->biHeight-1; b <h2->biHeight; b++,c--) for(int a = 0; a < h2->biWidth; a++) { BYTE * color = (BYTE* ) (Pic + ((a + (b*h2->biWidth))*(h2->biBitCount/8)) + h1->bfOffBits ); col = 0; col |= *(color); col <<=8; col |= *(color+1); col <<=8; col |= *(color+2); pDC->SetPixel(a,c,col); } //delete[] Pic; }Nun habe ich aber folgendes problem.
Wenn ich ein normales Bitmap nehme, also eines wo ich selbst ein bischen gezeichnet hab, dann wird das Bild richtig angezeigt. Aber sobald ich z.B. nen Screenshot nehme, macht er alles Grau, nur am ende des Bildes sind ein paar Bildausschnitte.Wie kann das sein das alles grau wird?