Problem mit Alphablending und Colorkey
-
Hi,
ich habe vor Jahren mal im Netz eine Funktion gefunden für das Blitten via Alphablending und Colorkey. Doch irgendwie hat die Funktion eine Macke, das bei recht kleinen Grafiken (ca. 20x20) den Colorkey nicht mehr richtig rausfiltert und irgendwie "Fragmente" vorhanden sind.
Hab mal ein Bild hochgeladen:
http://img42.imageshack.us/img42/3041/testmc.pngAls Colorkey habe ich RGB(0, 255, 0) angegeben. Interessanterweise funktioniert das Rausfiltern bei recht großen Grafiken von so 200x200 problemlos.
Hier der Code:
void OpaqueBlit(HDC hdc, int destX, int destY, int destWidth, int destHeight, HDC hdc2, int srcX, int srcY, int alpha, UINT transparency) { unsigned char* pImageBits = NULL; unsigned char* pBackBits = NULL; BITMAPINFO bmBitmapInfo = {0}; HBITMAP hBitmap, hBitmap2, old_bitmap_, old_bitmap_2; HDC compHDC; HDC compHDC2; int i; bmBitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmBitmapInfo.bmiHeader.biCompression = BI_RGB; bmBitmapInfo.bmiHeader.biHeight = destHeight; bmBitmapInfo.bmiHeader.biWidth = destWidth; bmBitmapInfo.bmiHeader.biBitCount = 24; bmBitmapInfo.bmiHeader.biClrUsed = 1; bmBitmapInfo.bmiHeader.biPlanes = 1; hBitmap = CreateDIBSection(hdc, &bmBitmapInfo, DIB_RGB_COLORS,(void **)&pImageBits, 0,0); hBitmap2 = CreateDIBSection(hdc, &bmBitmapInfo, DIB_RGB_COLORS,(void **)&pBackBits, 0,0); compHDC = CreateCompatibleDC(hdc); old_bitmap_ = (HBITMAP)SelectObject(compHDC, hBitmap); compHDC2 = CreateCompatibleDC(hdc2); old_bitmap_2 = (HBITMAP)SelectObject(compHDC2, hBitmap2); BitBlt(compHDC, 0, 0, destWidth, destHeight, hdc, destX, destY, SRCCOPY); BitBlt(compHDC2, 0, 0, destWidth, destHeight, hdc2, srcX, srcY, SRCCOPY); if (alpha != 255) { for (i = 0; i < destHeight * destWidth * 3; i += 3) { if (RGB(pBackBits[i + 0], pBackBits[i + 1], pBackBits[i + 2]) != transparency) { pImageBits[i + 0] += ((pBackBits[i + 0] - pImageBits[i + 0]) * alpha + 255) >> 8; pImageBits[i + 1] += ((pBackBits[i + 1] - pImageBits[i + 1]) * alpha + 255) >> 8; pImageBits[i + 2] += ((pBackBits[i + 2] - pImageBits[i + 2]) * alpha + 255) >> 8; } } } else { for (i = 0; i < destHeight * destWidth * 3; i += 3) { if (RGB(pBackBits[i + 0], pBackBits[i + 1], pBackBits[i + 2]) != transparency) { pImageBits[i + 0] = pBackBits[i + 0]; pImageBits[i + 1] = pBackBits[i + 1]; pImageBits[i + 2] = pBackBits[i + 2]; } } } BitBlt(hdc, destX, destY, destWidth, destHeight, compHDC, 0, 0, SRCCOPY); SelectObject(compHDC, old_bitmap_); SelectObject(compHDC2, old_bitmap_2); DeleteObject(hBitmap); DeleteObject(hBitmap2); DeleteDC(compHDC); DeleteDC(compHDC2); }Hier der Aufruf für das Zeichnen:
OpaqueBlit(hdcTarget, x, y, sourceWidth, sourceHeight, hdcSource, 0, 0, 128, RGB(0,255,0));Die Grafik (24 Bit BMP) habe ich mit LoadImage geladen. Wenn ich TransparentBlt benutze geht das problemlos, jedoch kann die kein Alpha.
Einen Fehler konnte ich jedoch nicht rausfinden...
Jemand eine Idee?
Viele Grüße,
Thomas23
-
niemand eine idee?

-
Nimm doch direkt AlphaBlend:
http://msdn.microsoft.com/en-us/library/dd183351(VS.85).aspx...oder nimm GDI+, dann kannste auch direkt ne PNG mit Alpha-Kanal laden und zeichnen.
-
Hi geeky!
leider muss ich für ein WinNT-basierendes System (Embedded) coden. Da gibt es laut MSDN noch kein AlphaBlend und GDI+ fällt da schon direkt weg.
Dazu kann AlphaBlend meines wissens auch keinen Color-Key, oder?
Hat sonst keiner mehr eine Idee?
