Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.061 c
2-1133110516
Neosted
2005-11-27 19:55
2005.12.11
Память компьютера


1-1132131172
Wolferio
2005-11-16 11:52
2005.12.11
Обработка Ошибок


3-1130308266
Goldmund
2005-10-26 10:31
2005.12.11
Работа с БД с применением DLL


2-1132253742
bodomic
2005-11-17 21:55
2005.12.11
Поясните пожалуйста работу с AWE на примере?


2-1132814923
tytus
2005-11-24 09:48
2005.12.11
Снова Paskal