आप एक paletted डीआईबी धारा, पिक्सेल प्रति 8 बिट और 256 रंगों बना सकते हैं और भूरे रंग {0 को पैलेट प्रारंभ , 0, 0}, {1, 1, 1}, ... {255, 255, 255}।
इस बिटमैप में एक एकल जीडीआई BitBlt
आपकी मूल छवि को भूरे रंग में डाल देगा। यहां कोड स्निपेट है (सी ++, एटीएल और डब्ल्यूटीएल में - लेकिन आपको विचार मिलना चाहिए)।
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));
स्रोत
2011-12-19 22:57:31
मुझे एकल जीडीआई फ़ंक्शन के बारे में पता नहीं है जो न ही पैलेट रूपांतरण के बारे में करेगा, लेकिन आपके द्वारा वर्णित लिंक से तीसरा फ़ंक्शन ऐसा करता है। मुझे लगता है कि आप प्रदर्शन से डरते हैं ना? – TLama
यह न केवल प्रदर्शन के बारे में है, मैं एक आसान समाधान ढूंढ रहा हूं (शायद पैलेट या कुछ परिवर्तित करके)। –
32-बिट बिटमैप में पैलेट नहीं है। – MBo