Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

Как рисовать по картинке?   Найти похожие ветки 

 
Сатир ©   (2003-01-19 20:25) [0]

Суть вопроса вот в чём: есть Image1. В него загружена картинка. Часть картинки нужно выделить прямоугольником.
Используется метод DrawFocusRect. Но когда мышка попадает на картинку, картинка исчезает:(
Вот код:
procedure TMainFrm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with image1.Picture.Bitmap.Canvas do
case Stage of
stTopLeftOffset: begin DrawFocusRect(Rect(0,0,x,y));
DrawFocusRect(Rect(0,0,x,y));
end;
...

Заранее благодарен всем откликнувшимся


 
Song ©   (2003-01-19 20:31) [1]

Она исчезает из-за DrawFocusRect()?


 
Сатир ©   (2003-01-19 20:39) [2]

2Song © (19.01.03 20:31)
нет, она исчезает, когда код пытается произвести операцию рисования по кортинке. В подтверждение этому я заменил DrawFocusRect на Rectangle и эффект получился тот же:(


 
Song ©   (2003-01-19 20:44) [3]

Может особенность TImage? Попробуй скопировать изображение на созданный тобою TBitMap и производить с ним нужные тебе манипуляции. Так получится, я пробовал раньше.


 
Романов Р.В. ©   (2003-01-19 21:37) [4]

Картинка jpg?


 
Сатир ©   (2003-01-20 14:12) [5]

2Романов Р.В. © (19.01.03 21:37)
да

Вообщем, возникло ещё несколько вопросов по сабжу, поэтому задаю их здесь, чтоб не плодить новых веток.

У меня реализуется рисование прямоугольника по картинке, но при каждой его(прямоугольника) перерисовке, перерисовывается и сама картинка, что вызывает её мигание.
Мне подсказали, что можно рисовать таким макаром, чтоб цвет линий прямоугольника образовывался в результате инвертации цвета соответствующих точек картинки, и операция повторного рисования позволит востанавливать те точки, по которым был нарисован прямоугольник. Как именно это сделать, я пока не догадался:(. Может кто уже сталкивался с этим? Буду очень признателен, если поделитесь.
Вот кусок кода, который использует PenMode:
(при данном подходе получается мерцание картинки)
procedure TMainFrm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with image1.Canvas, SSkinBorder4 do begin
Pen.Mode:=pmNotXor;
Pen.Color:=clRed;
case Stage of
stSetBorders:begin
if not Rect_Assigned then exit;
Rectangle(OldRect);
x1:=x;
y1:=y;
OldRect.Right:=x;
OldRect.Bottom:=y;
Rectangle(OldRect);
end;
stTopLeftOffset:begin
...


 
Сатир ©   (2003-01-20 18:41) [6]

ладно, спрошу коротко:
как при рисовании по объекту TImage предотвратить его мерцание?


 
Романов Р.В. ©   (2003-01-20 19:50) [7]

В общем если загрузить картинку в Image2 а потом скопировать в
Image1 то код Сатир © (19.01.03 20:25) работает без проблем.

Image1.Picture.Bitmap.Assign(Image2.Picture.Graphic)


 
Сатир ©   (2003-01-20 20:29) [8]

2Романов Р.В. © (20.01.03 19:50)
спасибо за ответ, но я на этот вопрос уже определился.

осталось выяснить, как рисовать по холсту, и чтоб он при этом не мерцал?


 
Романов Р.В. ©   (2003-01-20 20:30) [9]

А он у меня и не мерцал


 
Сатир ©   (2003-01-20 21:30) [10]

2Романов Р.В. © (20.01.03 20:30)
а можно на код посмотреть, если это Вас не затруднит?


 
gsu ©   (2003-01-20 21:36) [11]

canvas.copyrect


 
Романов Р.В. ©   (2003-01-20 22:38) [12]

Вчера вроде работало, а сегодня не получается что-то (может я с bmp перепутал). Поставь у формы или на чем там у тебя расположен Image DoubleBuffered := True

Ну и код заодно
var
Form1: TForm1;
LastRect: TRect;
RectVisible: Boolean;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
t: TPicture;
begin
t := TPicture.Create;
try
t.LoadFromFile("C:\Splash.jpg");
Image1.Picture.Bitmap.Assign(t.Graphic);
Form1.DoubleBuffered := True;
finally
t.Free;
end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if RectVisible then
Image1.Picture.Bitmap.Canvas.DrawFocusRect(LastRect);
LastRect := Rect(X, Y, X, Y);
RectVisible := False;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then
begin
if RectVisible then
Image1.Picture.Bitmap.Canvas.DrawFocusRect(LastRect);
LastRect.BottomRight := Point(X, Y);
Image1.Picture.Bitmap.Canvas.DrawFocusRect(LastRect);
RectVisible := True;
end;
end;


 
Сатир ©   (2003-01-21 12:45) [13]

2Романов Р.В. © (20.01.03 22:38)
спасибо, всё работает


 
Сатир ©   (2003-01-21 13:39) [14]

вообщем, весь ответ лежал в этой срочке:
Form1.DoubleBuffered := True;



Страницы: 1 вся ветка

Текущий архив: 2003.01.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
1-96760
zavisalych
2003-01-22 10:26
2003.01.30
Баг в компиляторе? неверное присвоение локалькой переменной


14-96968
OlDemon
2003-01-10 13:18
2003.01.30
Кенгуренок Ру


3-96595
Niger
2003-01-13 15:22
2003.01.30
Capability not supported


1-96683
Dor
2003-01-21 20:01
2003.01.30
Memo1


1-96740
Andrey V.
2003-01-22 10:30
2003.01.30
FreeReport & мышинное колесо