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


Anmelden zum Antworten