Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.178.34] |
|
Сообщ.
#1
,
|
|
|
Есть функция преобразования входного битмапа в прозрачный битмап:
CBitmap * CreateDIB(CBitmap *m_fgBmp) { BITMAPINFO bmi; BITMAP bm; int sx, sy; HDC tempDC = GetDC(0); m_fgBmp->GetBitmap(&bm); sx = bm.bmWidth; sy = bm.bmHeight; bmi.bmiHeader.biSize = sizeof bmi.bmiHeader; bmi.bmiHeader.biWidth = sx; bmi.bmiHeader.biHeight = sy; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = 0; RGBQUAD *buffer, pixel; RGBTRIPLE *t1, *T1; HBITMAP hDIB = CreateDIBSection(tempDC, &bmi, DIB_RGB_COLORS, (void**)&buffer, 0, 0); if (buffer == NULL) buffer = NULL; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biClrUsed = 0; int widthBytes = sx * 3 + (sx * 3) % 4; char* bits1 = new char[widthBytes*sy]; GetDIBits(tempDC, *m_fgBmp, 0, sy, bits1, &bmi, DIB_RGB_COLORS); T1 = (RGBTRIPLE*)(bits1); for (int i = 0; i<sy; i++) { t1 = (RGBTRIPLE*)(bits1 + widthBytes*i); for (int j = 0; j<sx; j++) { if (isWhite(t1, T1)) { BYTE alpha = 0; pixel.rgbBlue = alpha; pixel.rgbGreen = alpha; pixel.rgbRed = alpha; pixel.rgbReserved = alpha; } else { pixel.rgbBlue = t1->rgbtBlue; pixel.rgbGreen = t1->rgbtGreen; pixel.rgbRed = t1->rgbtRed; pixel.rgbReserved = 255; } *buffer++ = pixel; t1++; }; }; CBitmap *m_alphaBmp=new CBitmap;/// m_alphaBmp->Attach(hDIB); ReleaseDC(0, tempDC); delete[] bits1; /// Вот здесь падает с некоторыми битмапами. return(m_alphaBmp); }; Функцию вынул из проекта в интернете. С некоторыми битмапами работает нормально, а с некоторыми падает. Где грабли? |