Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > GDI: Копирование BMP с ColorKey


Автор: C/L 2.8.2004, 05:35
Мне нужно копировать картинку с одного DC на другой, используя ColorKey. Чтобы заданный цвет оказался прозрачным, т.е. пиксели данного цвета не копировались. В параметрах ф-ии BitBlt нужного свойства я не нашел, в других ф-иях копирования тоже. Желательно было бы осуществить это без GDI+. Хочу чтобы прога работала в Win98. Может есть какой нибудь способ. Помогите пожалуйста.

Автор: Олег М 2.8.2004, 07:27
Цитата
Хочу чтобы прога работала в Win98

ГДИ+ прекрасно работает в Вин98. Даже инсталлировать не надо. Просто копируешь ДЛЛки.

Автор: C/L 2.8.2004, 21:51
ДЛЛки копировать мне конечно лень, да и GDI+ я совсем не знаю. Но если кто нить знает, как это делается, пусть даже с помощью GDI+, покажите пожалуйста пример (очень прошу!!!) или ссылку какую нить. И напишите какие ДЛЛки нужны для GDI+.
По аглицкий я к сожаления не понимаю, но переводчиком пользоваться умею. smile.gif
Код
#define ThisIsOffTop
if ( Вы->Поможете( &мне)  )
{
   Я->БудуОченьРад();
   Я->ГадомБуду = !ЗАБУДУ;
   Я->Помогу = ЧЕМ_СМОГУ;
}
else
{
   Admin->KillMy ( ONLY_THIS_TOPIC);
}

Автор: mr.DUDA 2.8.2004, 22:14
В чём проблема ?
1) берём пикселы исходного битмапа, создаём по color key AND-маску
2) с пом. MaskBlt объединяем исходный битмап с требуемым, используя маску

Автор: C/L 2.8.2004, 22:29
А эта операция медленная?
Можешь подробнее рассказать о создании маски?
Это не GDI+.
И еще по GDI+: ее нужно подключать или простого копирования достаточно?

Автор: Олег М 3.8.2004, 06:08
Цитата
И еще по GDI+: ее нужно подключать или простого копирования достаточно?

Достаточно скопировать недостающие ДЛЛки в каталог со своей программой.
ГДИ+ намного проще, чем стандартный ГДИ. Времени сэкономишь массу. Наверное.
А где примеры взять, к сожалению не знаю. Попробуй здесь поискать http://www.codeguru.com/Cpp/G-M/ что-ли
Добавлено @ 06:09
Какие ДЛЛки не помню. Я просто запускал программу и что спрашивала, то и копировал

Автор: C/L 3.8.2004, 21:21
Спасибо, Олег М.
По поводу MaskBlt:
Я недавно дизассемблил MSPAINT из Win98 (хотел посмотреть пример использования маски) и никакого MaskBlt там не нашел. Значит она использует другой метод, возможно более быстрый (хотя это спорно). Хотя она может вызвать ф-ию не через таблицу импорта, я это еще не посмотрел.

Автор: AndyY 4.8.2004, 00:16
А нафига GDI+. Большущая и либа и тормозная под 9x.
Предлагаю сделать ручками через DIB SECTION - см. help на функции CreateDIBSection.

Автор: p0s0l 4.8.2004, 00:30
Цитата
В параметрах ф-ии BitBlt нужного свойства я не нашел, в других ф-иях копирования тоже

А эта http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_2y9g.asp не подходит ?
Код

BOOL TransparentBlt(
 HDC hdcDest,        // handle to destination DC
 int nXOriginDest,   // x-coord of destination upper-left corner
 int nYOriginDest,   // y-coord of destination upper-left corner
 int nWidthDest,     // width of destination rectangle
 int hHeightDest,    // height of destination rectangle
 HDC hdcSrc,         // handle to source DC
 int nXOriginSrc,    // x-coord of source upper-left corner
 int nYOriginSrc,    // y-coord of source upper-left corner
 int nWidthSrc,      // width of source rectangle
 int nHeightSrc,     // height of source rectangle
 UINT crTransparent  // color to make transparent
);

Последний параметр то что нужно...
Написано, что появилась начиная с 98ой винды...

Добавлено @ 00:38
Ай, блин, написано, что в 98-ой будут memory leaks'ы, если юзать TransparentBlt... Но там есть ссылка, где есть готовая функция - замена:
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B79212
правда, если посмотреть, то там больно много действий делается...
Можешь сделать проверку версии винды, если 98-ая, то юзая эту тормозную функцию, если не 98ая, то TransparentBlt...


Автор: p0s0l 4.8.2004, 00:46
В догонку: можно также юзать AlphaBlend, если сделать 32-битную картинку, и задавать прозрачность у каждого пикселя...

Автор: C/L 4.8.2004, 04:51
Спасибо, p0s0l. Как это я пропустил эту ф-ию, не знаю.
А твоя ссылка еще интереснее. Там я заметил такую строку:
cColor = SetBkColor(hdcTemp, cTransparentColor);
Неужто в ней все дело? Проверю напишу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)