Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
14-96956
Blackweber
2003-01-12 03:12
2003.01.30
Почему StringGrid так работает?


1-96805
denis24
2003-01-20 16:36
2003.01.30
вызов процедуры


1-96702
devil_83
2003-01-22 09:17
2003.01.30
Скопировать файл


9-96510
NDR
2002-08-08 10:47
2003.01.30
НА ЧЁМ ПИСАТЬ ?


3-96579
Mel
2003-01-11 08:07
2003.01.30
Открытие БД на Дос-машине в сети





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