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

Вниз

Сделать определенную область в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
14-1132144432
dr Tr0jan
2005-11-16 15:33
2005.12.11
Глюк в Multisim (EWB)


14-1132554332
Жук
2005-11-21 09:25
2005.12.11
Музыка из Цивилизации 4


1-1131637337
GrayFace
2005-11-10 18:42
2005.12.11
Получение содержимого регистров при исключении.


2-1132917097
начиннающий
2005-11-25 14:11
2005.12.11
прорисовка формы


2-1132964759
KGC
2005-11-26 03:25
2005.12.11
Отправка письма с аттачем с помощью WinSock





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский