Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизКак рисовать по картинке? Найти похожие ветки
← →
Сатир (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c