è possibile creare una tavolozza Sezione DIB, 8 bit per pixel e 256 colori, e inizializzare tavolozza per tonalità di grigio {0 , 0, 0}, {1, 1, 1}, ... {255, 255, 255}.
Un singolo GDI BitBlt
in questa bitmap renderà grigia l'immagine originale. Ecco lo snippet di codice (in C++, ATL e WTL - ma dovresti avere l'idea).
CWindowDC DesktopDc(NULL);
CDC BitmapDc;
ATLVERIFY(BitmapDc.CreateCompatibleDC(DesktopDc));
CBitmap Bitmap;
CTempBuffer<BITMAPINFO> pBitmapInfo;
const SIZE_T nBitmapInfoSize = sizeof (BITMAPINFO) + 256 * sizeof (RGBQUAD);
pBitmapInfo.AllocateBytes(nBitmapInfoSize);
ZeroMemory(pBitmapInfo, nBitmapInfoSize);
pBitmapInfo->bmiHeader.biSize = sizeof pBitmapInfo->bmiHeader;
pBitmapInfo->bmiHeader.biWidth = 320;
pBitmapInfo->bmiHeader.biHeight = 240;
pBitmapInfo->bmiHeader.biPlanes = 1;
pBitmapInfo->bmiHeader.biBitCount = 8;
pBitmapInfo->bmiHeader.biCompression = BI_RGB;
pBitmapInfo->bmiHeader.biSizeImage = 240 * 320;
pBitmapInfo->bmiHeader.biClrUsed = 256;
pBitmapInfo->bmiHeader.biClrImportant = 256;
for(SIZE_T nIndex = 0; nIndex < 256; nIndex++)
{
pBitmapInfo->bmiColors[nIndex].rgbRed = (BYTE) nIndex;
pBitmapInfo->bmiColors[nIndex].rgbGreen = (BYTE) nIndex;
pBitmapInfo->bmiColors[nIndex].rgbBlue = (BYTE) nIndex;
}
Bitmap.Attach(CreateDIBSection(DesktopDc, pBitmapInfo, 0, DIB_RGB_COLORS, NULL, 0));
ATLVERIFY(Bitmap);
BitmapDc.SelectBitmap(Bitmap);
////////////////////////////////////////////////
// This is what greys it out:
ATLVERIFY(BitBlt(BitmapDc, 0, 0, 320, 240, DesktopDc, 0, 0, SRCCOPY));
////////////////////////////////////////////////
ATLVERIFY(BitBlt(DesktopDc, 0, 240, 320, 240, BitmapDc, 0, 0, SRCCOPY));
fonte
2011-12-19 22:57:31
Non conosco la funzione GDI singola che lo farebbe né la conversione della tavolozza, ma la terza funzione del collegamento che hai citato lo fa. Immagino che tu abbia paura delle prestazioni, vero? – TLama
Non si tratta solo di prestazioni, sto cercando una soluzione più semplice (magari convertendo la tavolozza o qualcosa del genere). –
La bitmap a 32 bit non contiene palette. – MBo