Нужна функция, которая в определённом пикселе битмапа меняла бы в определенной составляющей одного из цветов значение второго по младшинству бита.
Я использую такую функцию:
value - новое значение бита, остальное, надеюсь понятно 
| Код |
void ChangeColor(HBITMAP &hBmp,HDC hBmpDC, unsigned long coord, char value) { if (hBmp) { HDC BufferDC=CreateCompatibleDC(NULL); // DC for Source Bitmap if (BufferDC) { HBITMAP hTmpBitmap = (HBITMAP) NULL; if (hBmpDC) if (hBmp == (HBITMAP)GetCurrentObject(hBmpDC, OBJ_BITMAP)) { hTmpBitmap = CreateBitmap(1, 1, 1, 1, NULL); SelectObject(hBmpDC, hTmpBitmap); }
HGDIOBJ PreviousBufferObject=SelectObject(BufferDC,hBmp); HDC DirectDC=CreateCompatibleDC(NULL); // DC for working if (DirectDC) { // Get bitmap size BITMAP bm; GetObject(hBmp, sizeof(bm), &bm);
// create a BITMAPINFO with minimal initilisation // for the CreateDIBSection BITMAPINFO RGB32BitsBITMAPINFO; ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO)); RGB32BitsBITMAPINFO.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); RGB32BitsBITMAPINFO.bmiHeader.biWidth=bm.bmWidth; RGB32BitsBITMAPINFO.bmiHeader.biHeight=bm.bmHeight; RGB32BitsBITMAPINFO.bmiHeader.biPlanes=1; RGB32BitsBITMAPINFO.bmiHeader.biBitCount=bm.bmBitsPixel;
// pointer used for direct Bitmap pixels access char * ptPixels;
HBITMAP DirectBitmap = CreateDIBSection(DirectDC,(BITMAPINFO)&RGB32BitsBITMAPINFO, DIB_RGB_COLORS, (void **)&ptPixels, NULL, 0); if (DirectBitmap) { // here DirectBitmap!=NULL so ptPixels!=NULL no need to test HGDIOBJ PreviousObject=SelectObject(DirectDC, DirectBitmap); BitBlt(DirectDC,0,0, bm.bmWidth,bm.bmHeight, BufferDC,0,0,SRCCOPY);
// here the DirectDC contains the bitmap // After all the inits we can do the job if(value) ptPixels[bm.bmBitsPixel*coord] |=value; else{ value =2; ptPixels[bm.bmBitsPixel*coord] &= ~value; }
SelectObject(DirectDC,PreviousObject);
// finish hBmp=DirectBitmap; } // clean up DeleteDC(DirectDC); } if (hTmpBitmap) { SelectObject(hBmpDC, hBmp); DeleteObject(hTmpBitmap); } SelectObject(BufferDC,PreviousBufferObject); // BufferDC is now useless DeleteDC(BufferDC); } } }
|
Вызываю фунцию так:
| Код | ChangeColor((HBITMAP)Image->Picture->Bitmap, 0, oMLS.GetCurrent(), value);
|
Проблема в том, что хотя (HBITMAP)Image->Picture->Bitmap нормальный
| Код | BITMAP bm; GetObject(hBmp, sizeof(bm), &bm);
|
возвращает пустую структуру, из-заи чего не создается DirectBitmap..
Просьба: привести функцию в рабочее состояние или предложить другую реализацию. Заранее спасибо |