Hi!
ich bin gerade dabei eine kleine Applikation in MFC zu schreiben und möchte damit jetzt auch BMPs laden. Nur vorab, ich bin MFC-Rookie!
Das klappt soweit eigentlich auch schon, nur sind die Bilder etwas verschoben und auf dem Kopf.
Woran das liegt ist mir eigentlich klar: der Header wird nicht richtig oder garnicht ausgelsen.
Ich weiß allerdings nicht, wie ich den Header richtig auslesen kann, und wie ich auf die biWidth und biHeight ran kommen.
Habe mir auch schon eine BitmapInfoHeader Struktur erstellt, aber richtig klappen will das noch nicht...
Hier mal die Fkt, die mir die Datei öffnet und anzeigt.
was ich haupsächlich möchte ist, dass ich Width und Height auslesen kann und dann mein Dynamisches Array entsprechend der beiden Größen aufziehn kann.
Und wie ich das Bild so ausrichten kann, dass es nicht mehr auf dem Kopf liegt.
Ich weiß zwar, dass es "pBMIH->biHeight = -512;" daran liegt, aber weiß auch nciht, wie ich ihm das sagen soll...
Hoffe jemand versteht (trotz meiner verwirrenden ausdrucksweise) was ich meine...
Danke schonmal
mfg
doggy
ich bin gerade dabei eine kleine Applikation in MFC zu schreiben und möchte damit jetzt auch BMPs laden. Nur vorab, ich bin MFC-Rookie!
Das klappt soweit eigentlich auch schon, nur sind die Bilder etwas verschoben und auf dem Kopf.
Woran das liegt ist mir eigentlich klar: der Header wird nicht richtig oder garnicht ausgelsen.
Ich weiß allerdings nicht, wie ich den Header richtig auslesen kann, und wie ich auf die biWidth und biHeight ran kommen.
Habe mir auch schon eine BitmapInfoHeader Struktur erstellt, aber richtig klappen will das noch nicht...
Hier mal die Fkt, die mir die Datei öffnet und anzeigt.
Code:
void CUebung3View::OnFileOpen()
{
CFileDialog fileDlg (TRUE, "*.*", "*.bmp",
OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, "*.bmp", this);
// Display the file dialog. When user clicks OK, fileDlg.DoModal()
// returns IDOK.
if( fileDlg.DoModal ()==IDOK )
{
CString pathName = fileDlg.GetPathName();
int w = 512, h = 512;
//Dynamischen Bildspeicher erzeugen (Feld mit Zeigern und Feld mit Zeigern auf
unsigned char* pBuffer = new UCHAR[w*h]; //dem Anfang jeder Zeile.
unsigned char** ppBild = new UCHAR*[h];
for(int i = 0; i < h; i++) ppBild[i] = pBuffer + i* w;
unsigned char header[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
BITMAPINFOHEADER *pBMIH = (BITMAPINFOHEADER*)header;
RGBQUAD *pColors = (RGBQUAD*)((char*)header+sizeof(BITMAPINFOHEADER));
pBMIH->biSize = sizeof(BITMAPINFOHEADER); // Anzahl der Bytes der BITMAPINFOHEADER Struktur
pBMIH->biWidth = 512; // Breite der Bitmap
pBMIH->biHeight = -512; // Höhe der Bitmap
pBMIH->biPlanes = 1; // Anzahl der Ebenen <=> muss 1 sein!
pBMIH->biBitCount = 8; // Anzahl der Bits pro Pixel (0,1,4,8,16,
pBMIH->biClrUsed = 255;
pBMIH->biCompression = BI_RGB; // Art der Komprimierung
pBMIH->biSizeImage = 0; // Für BI_RGB erlaubt
pBMIH->biXPelsPerMeter = 0; // Für die blosse Anzeige nicht wichtig
pBMIH->biYPelsPerMeter = 0; // "
pBMIH->biClrUsed = 0; // Volle Auflösung = 256 Einträge in die Farbtabelle bei 8-Bit pro Pixel
//Farbtabelle füllen
for(i = 0; i < 256; i++) {
pColors[i].rgbBlue = i;
pColors[i].rgbRed = i;
pColors[i].rgbGreen = i;
pColors[i].rgbReserved = 0;
}
std::ifstream in(pathName,ios::binary);
in.read((char*)pBuffer,w*h);
CClientDC dc(this);
CRect r;
GetClientRect(&r);
dc.SetStretchBltMode(COLORONCOLOR);
// StretchDIBits(dc.m_hDC,0,0,r.Width(),r.Height(),0,0,w,h,pBuffer,(BITMAPINFO*)pBMIH,DIB_RGB_COLORS,SRCCOPY);
SetDIBitsToDevice(dc.m_hDC,0,0,w,h,0,0,0,h,pBuffer,(BITMAPINFO*)pBMIH,DIB_RGB_COLORS);
//Change the window's title to the opened file's title.
CString fileName = fileDlg.GetFileTitle ();
SetWindowText(fileName);
}
}
was ich haupsächlich möchte ist, dass ich Width und Height auslesen kann und dann mein Dynamisches Array entsprechend der beiden Größen aufziehn kann.
Und wie ich das Bild so ausrichten kann, dass es nicht mehr auf dem Kopf liegt.
Ich weiß zwar, dass es "pBMIH->biHeight = -512;" daran liegt, aber weiß auch nciht, wie ich ihm das sagen soll...
Hoffe jemand versteht (trotz meiner verwirrenden ausdrucksweise) was ich meine...

Danke schonmal
mfg
doggy