Форум: "Начинающим";
Текущий архив: 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