Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прозрачьность с помощью GDI, реально? GDI 
:(
    Опции темы
Евгений
Дата 27.11.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.6.2006
Где: г. Невинномысск

Репутация: нет
Всего: 1



Всем доброго дня! 
Имеется картинка BMP, в ценре какойто рисунок по бокам фон закрашен в какой либо однородный цвет, к примеру чёрный, белый и т.д.
Так вот в чем вопрос, реально сделать так чтобы при выводе ресунка при помощи GDI, рисунок в центре остался а фон сделался прозрачным?

За ранее спасибо!
PM MAIL WWW   Вверх
Alexeis
Дата 27.11.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



см. справку по 
TransparentBlt или AlphaBend


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
neosapient
Дата 28.11.2006, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Здравствуйте.

Аlexeis1,
Цитата

см. справку по 
TransparentBlt или AlphaBend 

В MSDN взял типовой пример, чуть подправил (смотри приложение).
С функцией TransparentBlt разобраться не смог, можно поясненить ее назначение?

Возник другой вопрос про псевдопрозрачность (или полную прозрачность  по ключевому цвету).
Т.е. когда в VC7 я рисую картинки, то один из цветов можно назначить прозрачным. 
При использовании картинки, в место прозрачного цвета будет использоваться bitmap области лежащей за ним.
Вопрос как узнать, какое DWORD значение имеет этот прозрачный цвет?
Есть ли специальная функция для копирования с одного битмепа на другой, так чтоб сработали прозрачные пиксели?
Что быстрее будет работать?:
 - функция описаная мной в вопросе выше;
 - полный перебор всех DWORD`ов битмепа, и их обработка через альфа канал;
 - полный перебор всех DWORD`ов битмепа, использование GetPixel и SetPixel, с предварительной проверкой на нераветво значению прозрачного цвета.

Это сообщение отредактировал(а) neosapient - 28.11.2006, 00:16

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  AlphaBendTest2.rar 63,30 Kb
PM MAIL   Вверх
Earnest
Дата 28.11.2006, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(neosapient @  28.11.2006,  01:15 Найти цитируемый пост)
Есть ли специальная функция для копирования с одного битмепа на другой, так чтоб сработали прозрачные пиксели?
Что быстрее будет работать?:

Это и есть TransparentBlt. Она делает то же что BitBlt, но заданный цвет оставляет прозрачным.
Разберись с классом функций XXXBlt, начиная с BitBlt: они все похожи.

Однозначно быстрее (причем на порядок) работают функции XXXBlt, чем перебор пикселов. Они, кстати, вовсе не DWORD. Если ты полагаешь, что там лежат значения в формате COLORREF, то сильно ошибаешься.


--------------------
...
PM   Вверх
neosapient
Дата 28.11.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Earnest, правь пример:
Код

int err;
PAINTSTRUCT ps;
HDC dc;
static HBITMAP bmPic;
static HDC dcPic;
switch( message )
{
    case WM_INITDIALOG:
        bmPic = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
        dcPic=CreateCompatibleDC(GetDC(hDlg));
        SelectObject(dcPic, bmPic);
        break;   
    case WM_PAINT:
        dc = BeginPaint(hDlg, &ps);
        TransparentBlt(dc,0,0,100,100,dcPic,0,0,100,100,GetPixel(dcPic, 1, 1));
        EndPaint(hDlg, &ps);
        break;         
    case WM_DESTROY :
        DeleteDC(dcPic);
        DeleteObject(bmPic);
        PostQuitMessage(0);
        return 0;
}    


Я ожидал, что будет вывод рисунка по фиалетовой маске, но что то не работает

Это сообщение отредактировал(а) neosapient - 28.11.2006, 10:05

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  DrawInDialog6.rar 36,43 Kb
PM MAIL   Вверх
Earnest
Дата 28.11.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



А что получается?
Вместо GetPixel попробуй подставить RGB явно...
И убедись, что такой цвет реально есть...
Сначала попробовал бы с чем-то очевидным, типа черного или белого цвета...


--------------------
...
PM   Вверх
neosapient
Дата 28.11.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

Вместо GetPixel попробуй подставить RGB явно...
И убедись, что такой цвет реально есть...
Сначала попробовал бы с чем-то очевидным, типа черного или белого цвета... 

А в чем проблема фиалетового? - обычный 0х00ff00ff
GetPixel именно это значение и возвращаяет.

[off topic]
Люди добрые, сами мы не местные, грамоте не учены, клавиатуры пугаимси.
[/off topic]

В общем помогите сделать пример работы ф-ции TransparentBlt, я попытался, но не выходит.
В моем примере после вызова TransparentBlt, GetLastError возвращает ошибку 87: "The parameter is incorrect. "


Это сообщение отредактировал(а) neosapient - 28.11.2006, 14:01
PM MAIL   Вверх
neosapient
Дата 28.11.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Понял в чем проблема. 
Цитата

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

неправильно ввел размеры
Какой функцией можно узнать размеры битмепа?

Это сообщение отредактировал(а) neosapient - 28.11.2006, 15:35
PM MAIL   Вверх
Alexeis
Дата 28.11.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



вот так вот у меня на билдере вышло.
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  img2->Canvas->Brush->Color = 0xFF00FF;
  img2->Canvas->FillRect(img2->ClientRect);
  img2->Canvas->Ellipse(img2->ClientRect);

  img3->Canvas->Brush->Color = 0xFFFF00;
  img3->Canvas->FillRect(img3->ClientRect);
  img3->Canvas->Ellipse(img3->ClientRect);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn1Click(TObject *Sender)
{
  TransparentBlt(img3->Canvas->Handle, 0, 0,
                img2->ClientWidth, img2->ClientWidth,
                img2->Canvas->Handle, 0, 0,
                img2->ClientWidth, img2->ClientWidth,
                 0xFF00FF);

 img3->Invalidate();
}


Цитата(neosapient @  28.11.2006,  15:19 Найти цитируемый пост)
Какой функцией можно узнать размеры битмепа?

GetObject()




Это сообщение отредактировал(а) alexeis1 - 28.11.2006, 16:40


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
neosapient
Дата 28.11.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

Какой функцией можно узнать размеры битмепа?
Цитата

GetObject()

Спасибо, теперь все работает.

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  DrawInDialog6.rar 36,62 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.