Главная страница
    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.48 MB
Время: 0.009 c
3-96624
Voland_s
2003-01-11 17:56
2003.01.30
server time out


1-96651
opoloXAI
2003-01-21 14:47
2003.01.30
TListView and Long-Long-Long Hint


3-96591
DenisLK
2003-01-13 13:33
2003.01.30
TQuery


1-96819
Олег Лаукарт
2003-01-20 15:22
2003.01.30
Event для TCollectionItem


1-96795
Larisa
2003-01-23 09:29
2003.01.30
При формировании отчета в MS Word использую метод





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