C
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;
}