Bild aus BYTE Array anzeigen
-
Hallo,
ich bin dabei ein Klasse umzusetzen die es ermöglicht, verschiedene Bilddaten
zu kapseln und zu verarbeiten.
Ich habe nun eine Problem beim Umgang mit Bilddaten in Form eines BYTE Arrays. Es
handelt sich um ein 8Bit Grauwertbild. Ich nutze folgende Funktion um ein CBitmap
Objekt daraus zu erzeugen.unsigned int BitmapCtrl::InitImageData(BYTE* imagePointer, long &Height, long &Width) { m_iHeight = Height; m_iWidth = Width; m_iSize = Width * Height; if(imagePointer != NULL) { m_bImagePointer = imagePointer; if(m_Bitmap.CreateBitmap(m_iWidth,m_iHeight,1,8,imagePointer)==0) return 0; } else { m_bImagePointer = NULL; } return 1; }
Die folgende Funktion soll nun das Bild anzeigen. Es erfolgt aber leider keine Ausgabe.
unsigned int BitmapCtrl::ShowImage(HWND pWnd) { if(pWnd) m_pWnd = pWnd; CDC dc; HDC hDC = ::GetDC(m_pWnd); dc.Attach(hDC); CRect DrawRect; ::GetClientRect(m_pWnd, &DrawRect); BITMAP bm; m_Bitmap.GetObject( sizeof( bm ), &bm ); CDC SpeicherDC; SpeicherDC.CreateCompatibleDC( &dc ); SpeicherDC.SelectObject( &m_Bitmap ); dc.SetStretchBltMode( HALFTONE ); dc.StretchBlt( 0, 0, DrawRect.right, DrawRect.bottom, &SpeicherDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY ); return 1; }
Wenn ich nun eine gespeichertes Bild lade und erneut ShowImage aufrufe, wird ein Bild
angezeigt.unsigned int BitmapCtrl::LoadImageFile(CString sFilePathName) { CString strBitmap; HBITMAP hBitmap = (HBITMAP) ::LoadImage (AfxGetInstanceHandle(),sFilePathName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if(hBitmap) { if(m_Bitmap.DeleteObject()) // War Bitmap vorhanden, löschen m_Bitmap.Detach(); // Aktuell geladenes Bitmap mit Bitmap-Objekt verbinden m_Bitmap.Attach(hBitmap); if(m_bImagePointer == NULL) { BITMAP bm; m_Bitmap.GetObject( sizeof( bm ), &bm ); m_iHeight = bm.bmHeight; m_iWidth = bm.bmWidth; m_iSize = m_iHeight * m_iWidth; bool m_bIsMemAlloc = true; m_bImagePointer = (BYTE*)malloc(m_iSize); } // Geladene Bilddaten in den Speicher schreiben GetBitmapBits(hBitmap,m_iSize,m_bImagePointer); } else return 0; return 1; }
Könnte mir bitte jemand sagen, wo mein Denkfehler liegt. Anscheinend habe ich
irgendein Initialisierungsproblem. Wenn ich nämlich ein Bild geladen habe, funktioniert
auch die Anzeige eines Grauwertbild das ich mit folgender Funktion zuweisen kann.unsigned int BitmapCtrl::SetImagePointer(BYTE *pBuffer) { if(m_bImagePointer = NULL) { m_bImagePointer = pBuffer; if(m_Bitmap.CreateBitmap(m_iWidth,m_iHeight,1,8,pBuffer) == 0) return 0; } else { m_bImagePointer = pBuffer; if(m_Bitmap.SetBitmapBits(m_iSize,pBuffer) == 0) return 0; } return 1; }
Ich hoffe man kann verstehen was mein Problem ist, ist ja recht schwer zu erklären.
Schonmal vielen Dank.Gruss Charlie
-
Ich habe jetzt folgendes herausgefunden:
Ein 8Bit Bitmap kann nur angezeigt werden, wenn die Bildschirmauflösung auch
entsprechend eingestellt ist.Wenn ich ein Bitmap abhängig vom Geräte Kontext erstelle, wird das Bild angzeigt,
aber teilweise werden seltsame Farbwerte dargestellt, was in einem Graubild
eigentlich nichts zu suchen hat.Muss ich für die korrekte Darstellung eines 8Bit Grauwertbildes auf einem System
mit einer Aulösung von 32bit eine Palette erzeugen?Vielleicht hat ja auch jemand einen Link der dieses Thema behandelt.
Gruss Charlie