Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.06;
Скачать: CL | DM;

Вниз

Прозрачность TBitmap.   Найти похожие ветки 

 
MonoLife ©   (2009-07-07 05:59) [0]

Избитый вопрос о прозрачном битмэпе, но хотелось бы понять.
Создаю TBitmap, допустим, IMG. Рисую на нем произвольную фигуру не прямоугольную. Заливаю abuehe FloodFill() черным цветом.
Затем копирую в другой TBitmap:
   TBitmap.Canvas.CopyMode := cmSrcCopy;
   TBitmap.Canvas.CopyRect(TRect1, IMG.Canvas, TRect1);

Накладываю картинку:
   TBitmap.Canvas.CopyMode := cmSrcPaint;
   TBitmap.Canvas.CopyRect(TRect, Pict.Canvas, TRect2);

Соответственно, черный цвет не прозрачный, белый – прозрачный.
Но если в накладываемой картинке есть чисто белый цвет, то будут прозрачные «дырки».
Как сделать TransparentColor не белым в этом случае?


 
brother ©   (2009-07-07 06:28) [1]

> Затем копирую в другой TBitmap:

предварительно залей его не белым цветом и потом выставь TransparentColor в нужный тебе цвет)


 
MonoLife ©   (2009-07-07 06:49) [2]


> brother ©   (07.07.09 06:28) [1]

Не получается:(
IMG - 1-й TBitmap
IMG2 - 2-й TBitmap:

IMG2.Canvas.Brush.Color:=clOlive;
IMG2.Canvas.FillRect(Rect(0,0,IMG2.Width, IMG2.Height));
IMG2.TransparentColor:=clFuchsia;
IMG2.Canvas.CopyMode := cmSrcCopy;
IMG2.Canvas.CopyRect(TRect1, IMG.Canvas, TRect1);
IMG2.Canvas.CopyMode := cmSrcPaint;
IMG2.Canvas.CopyRect(TRect1, Pict.Canvas, TRect2);


Фон теперь белый, не прозрачный.


 
brother ©   (2009-07-07 07:19) [3]

весь код приведи, с созданием итд


 
MonoLife ©   (2009-07-07 07:35) [4]

...
 private
   { Private declarations }
  mask_bm: TBitmap;
  draw_bm: TBitmap;
  pict_bm: TBitmap;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
Var
TitRect,desR: TRect;
begin
mask_bm:=TBitmap.Create;
pict_bm:=TBitmap.Create;
draw_bm:=TBitmap.Create;
pict_bm.LoadFromFile(ExtractFilePath(Application.ExeName)+"002.bmp");

TitRect:=Rect(0,0,60,60);
desR:=Rect(0,0,50,50);

BTitle.Canvas.Brush.Color:=clBlack;
BTitle.Canvas.Rectangle(5,5,40,40);

draw_bm.Width:=60;
draw_bm.Height:=60;

mask_bm.Width:=60;
mask_bm.Height:=60;

//для упрощения рисую простую фигуру
mask_bm.Canvas.Brush.Color:=clBlack;
mask_bm.Canvas.Rectangle(5,5,40,40);

draw_bm.Canvas.Brush.Color:=clOlive;
draw_bm.Canvas.FillRect(TitRect);
draw_bm.TransparentColor:=clFuchsia;

draw_bm.Canvas.CopyMode := cmSrcCopy;
draw_bm.Canvas.CopyRect(TitRect, mask_bm.Canvas, TitRect);
draw_bm.Canvas.CopyMode := cmSrcPaint;
draw_bm.Canvas.CopyRect(TitRect, pict_bm.Canvas, desR);
// draw_bm.Transparent:=true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 mask_bm.Free;
 pict_bm.Free;
 draw_bm.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 self.Canvas.Draw(50,50, draw_bm);
end;


 
MonoLife ©   (2009-07-07 07:38) [5]

Сорри, код не оформил нормально..
BTitle.Canvas.Brush.Color:=clBlack;
BTitle.Canvas.Rectangle(5,5,40,40);

Это убрать, ошметки.. я пробовал с пом 3х битмэпов..


 
Юрий Зотов ©   (2009-07-07 10:08) [6]

1. Готовим маску: фигуру в ней заливаем черным, а фоновую область (ту, что потом станет прозрачной) заливаем белым.

2. Рисуем маску с CopyMode = cmSrcAnd.

3. Готовим картинку: фоновую область в ней заливаем черным.

4. Рисуем картинку с CopyMode = cmSrcPaint.

================

Либо просто используем TImage с Transparent=True.


 
MonoLife ©   (2009-07-07 10:27) [7]

Спасибо, Юрий.

> Либо просто используем  с Transparent=True.

В своей задаче TImage не могу использовать, поэтому последую вашим советам. Надеюсь, я все правильно понял))


 
MonoLife ©   (2009-07-07 11:22) [8]

Получилось так
...
mask_bm,  draw_bm,  pict_bm: TBitmap;
...
Var
TitRect,desR: TRect;
BTitle: TBitmap;
begin
BTitle:=TBitmap.Create;
try
TitRect:=Rect(0,0,60,60);
desR:=Rect(0,0,50,50);
BTitle.Width:=60;
BTitle.Height:=60;

draw_bm.Width:=60;
draw_bm.Height:=60;

mask_bm.Width:=60;
mask_bm.Height:=60;

//готовим маску:
mask_bm.Canvas.Brush.Color:=clWhite;
mask_bm.Canvas.FillRect(TitRect);
mask_bm.Canvas.Brush.Color:=clBlack;
mask_bm.Canvas.Rectangle(5,5,40,40);

//рисуем маску:
draw_bm.Canvas.CopyMode:= cmSrcAnd;
draw_bm.Canvas.CopyRect(TitRect, mask_bm.Canvas, TitRect);

//готовим картинку:
BTitle.Canvas.Brush.Color:=clBlack;
BTitle.Canvas.FillRect(TitRect);

//рисуем картинку:
BTitle.Canvas.CopyMode := cmSrcPaint;
BTitle.Canvas.CopyRect(TitRect, pict_bm.Canvas, TitRect);

//собираем в целое:
draw_bm.Canvas.CopyMode:= cmSrcErase; //если указать cmSrcPaint, то фон так и останется белым
draw_bm.Canvas.CopyRect(TitRect,BTitle.Canvas,desR);
draw_bm.Transparent:=true;
finally
  BTitle.Free;
end;
end;

в конечном итоге прозрачным получился черный цвет и я, как бы, добился желаемого - сделать белый цвет не прозрачным.
Видимо, я что-то не понял.((


 
Юрий Зотов ©   (2009-07-07 12:12) [9]


procedure TForm1.FormPaint(Sender: TObject);
const
 Size = 60; // Общий размер
 Bnd = 20; // Ширина прозрачной границы общей области
 FgColor = clYellow; // Цвет фигуры - может быть любым
var
 FgR, BgR: TRect; // Область фигуры и общая
 Mask, Pic: TBitmap; // Маска и картинка

 function CreateBmp(FgColor, BgColor: TColor): TBitmap;
 begin
   Result := TBitmap.Create;
   with Result do
   try
     Width := Size;
     Height := Size;
     Canvas.Brush.Color := BgColor; // Заливаем общую область
     Result.Canvas.FillRect(BgR);
     Canvas.Brush.Color := FgColor; // Заливаем фигуру
     Result.Canvas.FillRect(FgR)
   except
     Free;
     raise
   end
 end;

begin
 FgR := Rect(Bnd, Bnd, Size - Bnd, Size - Bnd);
 BgR := Rect(0, 0, Size, Size);
 Mask := CreateBmp(clBlack, clWhite); // Готовим маску
 try
   Pic := CreateBmp(FgColor, clBlack); // Готовим картинку
   try
     Canvas.CopyMode := cmSrcAnd; // Рисуем маску
     Canvas.CopyRect(Bgr, Mask.Canvas, Bgr);
     Canvas.CopyMode := cmSrcPaint; // Рисуем картинку
     Canvas.CopyRect(Bgr, Pic.Canvas, Bgr)
   finally
     Pic.Free
   end
 finally
   Mask.Free
 end
end;

И все прекрасно работает при любом цвете фигуры, включая белый и черный.

> поэтому последую вашим советам. Надеюсь, я все правильно понял
Видимо, не все. Например, то, что уж если следовать советам, то ТОЧНО.


 
MonoLife ©   (2009-07-07 12:32) [10]

В
> Юрий Зотов ©   (07.07.09 12:12) [9]

Ясно. Благодарю. Попытаюсь собрать битмэп...



Страницы: 1 вся ветка

Текущий архив: 2009.09.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1247060009
tomkat
2009-07-08 17:33
2009.09.06
компоненты в консольном приложении


15-1246948249
Kolan
2009-07-07 10:30
2009.09.06
Помогите найти исо-стандарт про иконки


2-1246337733
cr@nk
2009-06-30 08:55
2009.09.06
Прозрачное шифрование в InterBase


15-1246918524
DVM
2009-07-07 02:15
2009.09.06
Функция обратного вызова с переменным числом параметров.


2-1246969997
Zheksonz
2009-07-07 16:33
2009.09.06
Отклик от COM порта