Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прозрачность в TBitmap  (Прочитано 10214 раз)
0 Пользователей и 1 Гость смотрят эту тему.
oktonion
Постоялец

ru
Offline Offline

« : 04-03-2012 00:11 » 

Здравствуйте,
вопрос в следующем: Как получить на выходе из TBitmap картинку с прозрачным одноцветным фоном?

Пробую (в канве C находится изображение с кусками clGreen):
Код:

 TPicture *p = new TPicture;
 TCanvas *C = new TCanvas;

 C->Handle = defHandle;
 p->Bitmap->Width = 222;
 p->Bitmap->Height = 111;
 p->Bitmap->PixelFormat = pf32bit;
 p->Bitmap->Transparent = true;
 p->Bitmap->TransparentColor = clGreen;
 p->Bitmap->TransparentMode = tmFixed;
 p->Bitmap->Canvas->CopyMode = cmSrcCopy;
 p->Bitmap->Canvas->CopyRect(
                             TRect(0, 0, 222, 111),
                             C,
                             TRect(55, 55, 222, 111)
                            );
 delete C;
 p->Bitmap->SaveToFile("test.bmp");
 delete p;

На выходе изображение со всеми цветами без "прозрачностей".
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 04-03-2012 07:39 » 

Прозрачность - понятие условное. В данном случае конкретная программа позволяет использовать указанный цвет как прозрачный, но сам формат BMP такого не предусматривает. Ответ: никак.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #2 : 04-03-2012 08:49 » new

Можно, но надо делать еще битмап-маску и отрисовывать их (основной битмап и маску) совместно.
Другой вариант - при отрисовке использовать GDI+.
Записан
oktonion
Постоялец

ru
Offline Offline

« Ответ #3 : 04-03-2012 11:58 » 

Тоесть сначала закрасить канву нужным "прозрачным" цветом, что то такое? :

Код:
p->Bitmap->Canvas->Brush->Color = clGreen;
p->Bitmap->Canvas->Rectangle(TRect(0, 0, p->Bitmap->Width, p->Bitmap->Height);

И что значит отрисовывать совместно? Я так понимаю что CopyMode надо менять и
Код:
p->Bitmap->Canvas->CopyMode = cmSrcCopy;
для этого уже не годится. Тогда какой CopyMode нужен для совместной отрисовки?
« Последнее редактирование: 04-03-2012 12:05 от oktonion » Записан
zubr
Гость
« Ответ #4 : 04-03-2012 13:04 » 

Что то типа этого:
Код:
procedure DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap; clTransparent: TColor);
var
bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap;
oldcol: Longint;
begin
try
   bmpAND := TBitmap.Create;
   bmpAND.Width := Bmp.Width;
   bmpAND.Height := Bmp.Height;
   bmpAND.Monochrome := True;
   oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent));
   BitBlt(bmpAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
   SetBkColor(Bmp.Canvas.Handle, oldcol);

   bmpINVAND := TBitmap.Create;
   bmpINVAND.Width := Bmp.Width;
   bmpINVAND.Height := Bmp.Height;
   bmpINVAND.Monochrome := True;
   BitBlt(bmpINVAND.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpAND.Canvas.Handle, 0, 0, NOTSRCCOPY);

   bmpXOR := TBitmap.Create;
   bmpXOR.Width := Bmp.Width;
   bmpXOR.Height := Bmp.Height;
   BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
   BitBlt(bmpXOR.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpINVAND.Canvas.Handle, 0, 0, SRCAND);

   bmpTarget := TBitmap.Create;
   bmpTarget.Width := Bmp.Width;
   bmpTarget.Height := Bmp.Height;
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, Cnv.Handle, x, y, SRCCOPY);
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpAND.Canvas.Handle, 0, 0, SRCAND);
   BitBlt(bmpTarget.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, bmpXOR.Canvas.Handle, 0, 0, SRCINVERT);
   BitBlt(Cnv.Handle, x, y, Bmp.Width, Bmp.Height, bmpTarget.Canvas.Handle, 0, 0, SRCCOPY);
finally
   bmpXOR.Free;
   bmpAND.Free;
   bmpINVAND.Free;
   bmpTarget.Free;
end;
end;
Переведешь сам.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines