Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];

Вниз

Прозрачность 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
15-1247137679
Пит
2009-07-09 15:07
2009.09.06
Определение названия модуля по указателю


2-1246968716
cyber-pilot
2009-07-07 16:11
2009.09.06
Формат даты


4-1216299440
v
2008-07-17 16:57
2009.09.06
XP темы, PageControl и TEdit


3-1227087393
kulinar
2008-11-19 12:36
2009.09.06
соединения Delphi c БД Oracle


15-1246625032
Nil
2009-07-03 16:43
2009.09.06
Есть кто-нибдуь кто знает Delphi, С и кому интересен доп зработок





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский