8 Bit Graustufen Bitmap unter TrueColor richtig anzeigen



  • Hallo,

    ich bekomme von ein 8Bit Graustufen-Bitmap und muss es in TrueColor darstellen.

    Wenn ich die Farbeinstellung auf 256 Farben reduziere bekomme ich ein Bild, aber leider nicht in Graustufe sonder kunterbunt. Stelle ich die Farbtiefe der Grafikkarte höher als 256 Farben, wird kein Bild dargestellt. 😮

    Liegt es am BITMAP::bm_type?
    Welcher BITMAP::bm_type muss bei dem Bitmap angegeben sein?
    😕 😕 😕 😕

    bool CAACVisionView::ShowPicture( CDC *pDC )
    {	
    	CBitmap tempCBitmap, *pOldBMP;
    	CPalette *pOldPalette;
    	CMarker marker;
    	bool retValue, isNewPicture;
    	BOOL bRetCode;
    
    	isNewPicture = false;
    
    	CAACVisionDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return false;
    
    	retValue = false;
    	m_bIsPictureFromFile = false;
    
    	//Zeiger initialisieren
    	pOldBMP = NULL;
    	pOldPalette = NULL;
    
    	// temporäres DC erstellen
    	CDC *pTempDC = new CDC;			
    
    	m_nGrabber = pDoc->GetGrabberPort(this);
    	if( m_nGrabber != -1 )
    	{
    		if( m_bPictureRefreshTimerRunning )
    		{
    			m_OriginalBitmap = GetBitmapN( m_nGrabber,0, &isNewPicture );	
    		}
    		else
    		{
    			m_OriginalBitmap.bmBits = m_pPicture;
    		}
    
    		if(( pTempDC != NULL ) && ( m_OriginalBitmap.bmBits != NULL ))
    		{
    			bRetCode = pTempDC->CreateCompatibleDC( pDC );
    			ASSERT(bRetCode);
    			if( bRetCode != 0 )
    			{
    				pOldPalette = pTempDC->SelectPalette(&m_GreyScalePalette, 0 );
    				pTempDC->RealizePalette();
    				if( isNewPicture )
    				{
    					m_nPicturesTaken++;
    				}
    
    				// temp. CBitmap-Objekt fuer geladene Bitmap erstellen
    
    				tempCBitmap.CreateBitmapIndirect(&m_OriginalBitmap);
    
    				// Groesse und Anzahl der darstellbaren Farben des Speicher-DCs
    				// auf Bitmap-Aufloesung einstellen
    
    				pOldBMP = pTempDC->SelectObject(&tempCBitmap);
    
    				// Bitmap-Daten nun aus dem Speicher auf den Bildschirm kopieren
    				pDC->BitBlt( m_PictureStart.x, m_PictureStart.y, m_OriginalBitmap.bmWidth, m_OriginalBitmap.bmHeight, pTempDC, 0, 0, SRCCOPY);
    
    				pTempDC->SelectPalette(pOldPalette, 0 );
    				retValue = true;
    				pTempDC->SelectObject(pOldBMP);
    				m_bPictureUpdated = true;				
    			}
    			else
    			{
    				AfxMessageBox("Das Programm wird wegen Ressourcenmangel beendet", MB_ICONSTOP );
    				exit(0);
    			}	
    		}
    	}
    	//DeviceContext Zuweisung aufheben und löschen
    	this->ReleaseDC( pTempDC );
    	pTempDC->DeleteDC();
    	delete pTempDC;
    
    	return retValue; 
    }
    

Anmelden zum Antworten