Странный эффект при выводе изображения
От: Evgi1980  
Дата: 25.07.07 06:25
Оценка:
В hBitmap — исходный цветной рисунок, с маской RGB(255,0,255)
В hDC — должны получить результирующее изображение.


HDC hMemDc = ::CreateCompatibleDC(hDc);
HDC hSrcDC = ::CreateCompatibleDC(hDc);
int cx = rect.Width();
int cy = rect.Height();

// create mono or color bitmap
HBITMAP hBm = ::CreateBitmap(cx, cy, 1, 1, NULL);
HBITMAP hOldBitmap1 = (HBITMAP)::SelectObject(hMemDc, hBm);
::PatBlt(hMemDc, 0, 0, cx, cy, WHITENESS);

BITMAP b;
GetObject(hBitmap, sizeof(BITMAP),(LPSTR)&b); 
HBITMAP hOldBitmap2 = (HBITMAP)::SelectObject(hSrcDC, hBitmap);

::TransparentBlt(hMemDc, 
            0, 
            0, 
            cx, 
            cy, 
            hSrcDC, 
            0, 
            0, 
            b.bmWidth, 
            b.bmHeight, 
            RGB(255, 0, 255));

::BitBlt(hDc, rect.left, rect.top, cx, cy, hMemDc, 0, 0, SRCCOPY);

::SelectObject(hMemDc, hOldBitmap1); 
::ReleaseDC(0, hMemDc);

::SelectObject(hSrcDC, hOldBitmap2); 
::ReleaseDC(0, hSrcDC);
...


Получается странный эффект зеркалирования. От чего он взялся и как от него избавиться?

Рисунок: здесь
Re: Странный эффект при выводе изображения
От: Evgi1980  
Дата: 25.07.07 09:04
Оценка:
Меняю

::TransparentBlt(hMemDc, 
        0, 
        0, 
        cx, 
        cy, 
        hSrcDC, 
        0, 
        0, 
        b.bmWidth, 
        b.bmHeight, 
        RGB(255, 255, 255));


на

::BitBlt(hMemDc, 0, 0, cx, cy, hSrcDC, 0, 0, SRCCOPY);


и зеркалирование пропадает. Но надо выводить с маской. Как быть?
Re[2]: Странный эффект при выводе изображения
От: Andrew S Россия http://alchemy-lab.com
Дата: 25.07.07 12:04
Оценка:
E>и зеркалирование пропадает. Но надо выводить с маской. Как быть?


TransparentBlt does not mirror a bitmap if either the width or height, of either the source or destination, is negative.


А с учетом того, что эта функция еще и "протекает" на 9х — лучше ее не пользовать вообще. Можно посоветовать посмотреть реализацию оной у юаня, либо Q79212 и Q97365.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.