Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизСделать определенную область в image прозрачной Найти похожие ветки
← →
Grol © (2005-11-02 18:04) [0]Вообщем из темы наверное все понятно. Но могу пояснить. На форме есть Image1 и Image2. Image2 соответственно поверх Image1. В Formcreate закрашиваю их цветом. ДЛя Image2 создал процедуру MouseMove, там отлавливаю координаты мышки и рисую круг относительно этих координат в Image2. Мне нужно сделать так, чтоб тот круг, который я рисую в Image2 был прозрачным на сквозь, так, чтоб было видно Image1, который находится под Image2. Короче там в проекте все есть. :) Спасибо...
← →
PAVIA © (2005-11-02 18:33) [1]Лучше всего отказаться от 2 имиджев.
image2.Transparent:=true; //разрешаем прозрачность
устанавливаем либы, режим автомотического определения цвета прозрачности
image2.Picture.Bitmap.TransparentMode:=tmAuto;
или сам устанавливаешь цвет.
image2.Picture.Bitmap.TransparentColor:=clWhite ;
Или рисуешь сразу на 1 рисунке
Нужно установить, чтобы стиль был прозрачным
image1.Canvas.Brush.Style:=bsClear;
← →
Grol © (2005-11-03 03:20) [2]PAVIA спасибо. Я попробовал, то что Вы мне сказали, действительно, область внутри мною рисуемого круга стала прозрачной на Image2, но мне нужно немного другое. Мне необходимо, чтоб область в круге была прозрачной на сквозь, так чтоб можно было видеть, что находится за Image2 (как будто дырка в Image2), а область, которая не в круге (все пространство Image2, кроме круга) была не прозрачной. Короче, если выражаться простым русским языком, мне необходимо сделать сквозное отверстие в Image2 (как будто пуля прошла через Image2 :))))
← →
Grol © (2005-11-12 19:42) [3]Недавно разобрался с регионами и вот тут проблема одна. Сначало дам код, а потом поясню:
procedure TForm1.FormCreate(Sender: TObject);
var
EllRG:HRGN;
RectRG:HRGN;
begin
EllRG:=CreateEllipticRgn(0,0,Width,Height);
RectRG:=CreateRectRgn(0,0,Width,Height);
CombineRgn(RectRG,RectRG,EllRG,RGN_xor);
SetWindowRgn(Handle,RectRG,True);
end;
Вот код создания дырки в форме, но мне то нужно, чтоб дырка была в [B]Image[/B]. На форме [B]Image[/B] уже имеется. Что я сделал...вместо [B]Handle[/B] в процедуре [B]SetwindowRgn[/B] подставил Image1.Canvas.Handle-->не получилось сделать дырень. Потом написал так [B]Image1.Picture.Bitmap.Handle[/B]-->все равно не получилось. А как тогда это можно сделать?
← →
TStas © (2005-11-12 20:14) [4]А это точно обязательно должен быть имадж? Можно ведь вместо него в онпайт формы написать БрашКопи и указать прозрачный цвет.
← →
Grol © (2005-11-12 23:35) [5]Да это точно должен быть Image, так как он перерисовывается, а мне это и нужно.
← →
2Wish (2005-11-13 11:21) [6]2Grol?
Что значит "перерисовывается"? Canvas он и в африке Canvas, что на Image рисуй, что на форме.
← →
злобная танька (2005-11-13 11:51) [7]
> 2Wish (13.11.05 11:21) [6]
по ходу имеется ввиду шо при перекрытии формы или панели чем-нибудь картинка на канве стираеца а имейдж "перерисовывается".
← →
злобная танька (2005-11-13 11:53) [8]
> Grol © (12.11.05 19:42) [3]
канвас это не окно. а функция SetWindowRgn устанавливает регион окна, как видно из названия :)
← →
злобная танька (2005-11-13 12:40) [9]не уверена шо поняла задачу автора но может это прокатит:
var
Form1: TForm1;
Over, Under: TBitmap;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
over := TBitmap.Create;
over.Width := IMG.Width;
over.Height := IMG.Height;
under := TBitmap.Create;
under.Assign(IMG.Picture.Bitmap);
over.Canvas.Brush.Color := clBlack;
over.Canvas.FillRect(Rect(0,0, IMG.Width, IMG.Height));
IMG.Canvas.Draw(0, 0, Over);
end;
procedure TForm1.IMGMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
over.Canvas.Brush.Color := clBlack;
over.Canvas.FillRect(Rect(0,0, IMG.Width, IMG.Height));
over.Canvas.Brush.Color := clWhite;
over.Canvas.Ellipse(X - 20, Y - 20, X + 20, Y + 20);
BitBlt(IMG.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
Under.Canvas.Handle, 0, 0, SRCCOPY);
BitBlt(IMG.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
over.Canvas.Handle, 0,0, SRCAND);
BitBlt(over.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
over.Canvas.Handle, 0,0, SRCINVERT);
BitBlt(IMG.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
over.Canvas.Handle, 0,0, SRCPAINT);
IMG.Repaint;
end;
← →
Grol © (2005-11-13 18:40) [10]Спасибо, ща заценю...:)))
← →
PAVIA © (2005-11-13 19:06) [11]Ты меня немного не понял.
Берем первый image загружаем рисунок.
на него кладем второй image.
в form OnCreate
image2.Transparent:=true; //разрешаем прозрачность
image2.Picture.Bitmap.TransparentColor:=clWhite ;//устанавливаешь прозрачный цвет к примеру белый. И все что ты на рисуешь эти цветом, то и будет прозрачным.
← →
grol © (2005-11-13 21:30) [12]PAVIA я понял тебя, спасибо тебе.
Ладно...:) скажу зачем это мне нужно, т.е дыра в Image. Мне нужно сделать как бы эффекта фонарика. То есть я вожу по верхнему Imagu мышкой и у меня вырисовывается круг, круг прозрачный, и видно нижний Image. А верхнюю картинку я затемнил в Photoshope и вставил в верхний Image. Но проблема состоит в том, что когда верхний Image делаешь transparent, то появляются мерцания. :((( А в OpenGL я программировать не умею. Вот такая проблема :( Просто я думаю, что через регионы проблема решиться.
← →
злобная танька (2005-11-13 21:39) [13]
> grol © (13.11.05 21:30) [10]
ну шо?
работаит?
← →
злобная танька (2005-11-13 21:40) [14]ЗЫ
не совсеми картинками работает точнее даже только с BMP. т.е. в имейдж должен быть загружен bmp.
← →
Grol © (2005-11-14 21:43) [15]Да работает, только вот эти вредные капризные мерцания...эх у меня аж в глазах заребило. Что делать как от них избавиться?
← →
злобная танька © (2005-11-14 22:07) [16]у.. не знаю. у меня ничего не мерцает..
а вобще от мерцаниев можно избавиться если производить все операции с картинками на каком-нибудь TBitmap в памяти а для имейджа где это всё должно по идее отображаться вызывать только метод draw и рисовать на него то что в итоге получилось. при таком подходе может мерцать только на очень тупых компах типо как у нас в инстетуте.
← →
Antonn © (2005-11-15 05:17) [17]
> вызывать только метод draw
лучше только canvas.copyrect()
← →
злобная танька © (2005-11-15 09:06) [18]
> Antonn © (15.11.05 05:17) [17]
почему?
← →
злобная танька © (2005-11-15 09:40) [19]
> злобная танька © (15.11.05 09:06) [18]
гм посмотрела в TCanvas да действительно для данного примера copyRect будет ловчее. но еще лучше просто BitBlt. CopyRect использует ф-цию stratchBlt я подозреваю шо она медленнее работает плюс сам метод что то там делает ерунду всякую.
← →
Antonn © (2005-11-15 10:32) [20]злобная танька © (15.11.05 9:40) [19]
но еще лучше просто BitBlt.
угу, но разница в скорости со stretchbit не особо заметно. Да и вопросов меньше при использовании canvas.copyrect, там аргументов меньше :)
← →
GrayFace © (2005-11-15 10:44) [21]> Вот код создания дырки в форме
DeleteObject(EllRg) не хватает.
Так. Для сабжа надо всего лишь рисовать круг... Например так:
Image1 - светящаяся картинка, невидимый.
Circle,b:TBitmap;
b.Width:=2*r; (r - радиус)
b.Height:=2*r;
b.TransparentColor:=clTrans; (clTrans - цвет, которого нет в Image1)
OnMouseMove:
Image2.Canvas.CopyRect(Rect(lx-r,ly-r,lx+r,ly+r), Image2.Picture.Bitmap.Canvas, Rect(lx-r,ly-r,lx+r,ly+r));
with Circle, Canvas do
begin
Brush.Color:=clTrans;
FillRect(ClipRect);
Brush.Color:=clBlack;
Ellipse(ClipRect);
Transparent:=true;
TransparentColor:=clBlack;
end;
with b do
begin
CopyRect(ClipRect, Image1.Picture.Bitmap.Canvas, Rect(x-r,y-r,x+r,y+r));
Draw(0,0, Circle);
end;
Image2.Canvas.Draw(x-r, y-r, b);
lx:=x;
ly:=y;
Мерцание будет, но мало.
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.092 c