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

Вниз

необходимо выделить фрагмент изображения   Найти похожие ветки 

 
stud ©   (2004-09-16 17:56) [0]

на TImage. он выделяется, но происходит перерисовка компонента и соответсвенно "мерцание". как избавиться от этой проблемы?


 
default ©   (2004-09-16 18:13) [1]

а как рисуешь рамку выделения?
нужно отрезки прямых стирать путём их вывода в режиме xor
перерисовывать ничего не нужно
P.S. или я не понял вопроса...


 
stud ©   (2004-09-16 18:15) [2]

так и рисую. только при выделении фрагмента - движении мышки постоянно происходит перерисовка и соотв. моргание самого рисунка. как избавиться от этого моргания


 
default ©   (2004-09-16 18:19) [3]

stud ©   (16.09.04 18:15) [2]
хм...почему интересно рисунок моргает?если мы рисуем только линии...участки вне их мы же не трогаем...нафиг они перерисовываются(не по делу)


 
jack128 ©   (2004-09-16 18:33) [4]

default ©   (16.09.04 18:19) [3]
потому, что так работает Image. При любом изменении Canvas"а он себя полностью перерисовывает.


 
default ©   (2004-09-16 18:46) [5]

jack128 ©   (16.09.04 18:33) [4]
мдя...


 
olookin ©   (2004-09-16 18:48) [6]

Я бы, во-первых, рамку не рисовал, а изменял ее размеры. В качестве рамки использовал бы какой-нибудь TBevel. А во-вторых, я бы форме, на которой этот TImage, присвоил DoubleBuffered:=true;


 
wl   (2004-09-16 19:19) [7]

а я бы не использовал TImage и не парился, TPaintBox  не будет мерцать


 
jack128 ©   (2004-09-16 20:01) [8]

wl   (16.09.04 19:19) [7]
а я бы не использовал TImage и не парился, TPaintBox  не будет мерцать

Это смотря как его (PaintBox) использовать. Если на каждый чих делать PaintBox1.Invalidate - то таже фигня будет.. Мерцание можно уменьшить если у радителя выставить DoubleBuffered := True(правда fps уменьшутся, конечно :-)) . Но в данном случае я не уверен в этот подходе, потому, что TImage - он сам себе дает буфферизацию, и то у чела мерцает.. В общем не понятно..


 
_student   (2004-09-16 20:04) [9]


> stud ©


Покажи код перерисовки


 
stud ©   (2004-09-17 09:11) [10]

кода перерисовки никакого нет. я уже взял шейп и при движении мышкой по изображения меняю его размеры : faceselect.BoundsRect:=nr;
но при движении мышки область шейпа закрашивается в цвет фона и становится прозрачным при завершении опреции выделения. плюс непиятные тормоза.
может кто может подсказать как реализовать выделение картинки?


 
_student   (2004-09-17 09:18) [11]

Попробуй это

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 md: boolean;
 rec: trect;
 dc: hdc;
implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 md := true;
 rec.TopLeft := point(x, y);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 md := false;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var d: integer;
begin
 dc := getdc(form1.Handle);
 if rec.Left > rec.Right then
 begin
   rec.TopLeft := point(x, y);
 end
 else rec.BottomRight := point(x, y);
 if md = true then
 begin
   form1.Refresh;
   DrawFocusRect(dc, rec);
 end;
end;

end.


 
stud ©   (2004-09-17 09:30) [12]

работает, но на имадже нет прямоугольника который ограничивает выделяемое изображение


 
_student   (2004-09-17 09:44) [13]

Image1.Canvas.DrawFocusRect


 
stud ©   (2004-09-17 09:52) [14]


> Image1.Canvas.DrawFocusRect

а вот тут начинается все по старому - моргание


 
olookin ©   (2004-09-17 11:17) [15]

Ничего не понимаю, в чем проблема?

Вот это работает?

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls;

type
 TForm1 = class(TForm)
   Image1: TImage;
   Shape1: TShape;
   procedure FormShow(Sender: TObject);
   procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;
 oldx,oldy: integer;
 move: boolean=false;

implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
var i,j: integer;
begin
 for i:=0 to image1.width-1 do
 for j:=0 to image1.height-1 do
//  iMAGE1.cANVAS.Brush.Color:=clWhite;
 image1.Canvas.Pixels[i,j]:=RGB(i,j,i+j);
 //Fillrect(rect(0,0,Image1.width,Image1.Height));
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 move:=true; Shape1.width:=0; Shape1.height:=0; Shape1.Visible:=true;
 oldx:=x; oldy:=y;
 shape1.left:=image1.left+oldx;
 shape1.top:=image1.top+oldy;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if move then begin shape1.width:=x-oldx; shape1.height:=y-oldy; end;

end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 move:=false; Shape1.Visible:=false;
end;

end.


 
stud ©   (2004-09-17 11:48) [16]

у меня код такой:
procedure Tnewclientf.docfotoMouseDown(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if ssleft in shift then
   begin
     faceselect.Visible:=true;
     oldx:=x;
     oldy:=y;
     r.TopLeft:=point(x,y);
     r.BottomRight:=point(x,y);
   end;
end;

procedure Tnewclientf.docfotoMouseMove(Sender: TObject; Shift: TShiftState;
 X, Y: Integer);
begin
 if ssleft in shift then
 begin
   if oldx<x then
   begin
     r.Left:=oldx; r.Right:=x;
   end
   else
   begin
     r.Left:=x;
     r.Right:=oldx;
   end;
   if oldy<y then
   begin
     r.Top:=oldy;
     r.Bottom:=y;
   end
   else
   begin
     r.Top:=y;
     r.Bottom:=oldy;
   end;
   nr.Left:=r.Left+504;
   nr.Top:=r.Top+8;
   nr.Right:=r.Right+504;
   nr.Bottom:=r.Bottom+8;
   faceselect.BoundsRect:=nr;    
 end;
end;

procedure Tnewclientf.docfotoMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 nr : trect;
begin
 nr.Left:=0;
 nr.Top:=0;
 nr.Bottom:=r.Bottom-r.Top+1;
 nr.Right:=r.Right-r.Left+1;
 face:=tbitmap.Create;
 face.Canvas.BrushCopy(r, docfoto.Picture.Bitmap, r, clBlack);
 face.Width:=nr.Right;
 face.Height:=nr.Bottom;
 face.Canvas.CopyRect(nr,docfoto.Picture.Bitmap.canvas,r);
 newclientf.facefoto.Picture.Bitmap.assign(face);
 face.Free;
 faceselect.Visible:=false;
 faceselect.Width:=1;
 faceselect.Height:=1;
end;

faceselect - TShape


 
olookin ©   (2004-09-17 12:29) [17]

[16] stud ©   (17.09.04 11:48)

И что?


 
stud ©   (2004-09-17 13:15) [18]

размер картинки 640х480 и при выделении области
1 тормоза
2


 
stud ©   (2004-09-17 13:16) [19]

2
> stud ©   (17.09.04 09:11) [10]


 
olookin ©   (2004-09-17 15:09) [20]

Я так понял, мой вариант вас не устраивает по каким-то причинам? Или в чем проблема еще остается??


 
stud ©   (2004-09-17 15:27) [21]

все. разобрался. все св-ва по дефолту оставил - вроде нормально



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

Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.03 c
6-1090492324
Duk
2004-07-22 14:32
2004.10.03
Как с п-ю TMemoryStream переслать текст от ServerSocket к ClienSo


14-1095146264
Guest
2004-09-14 11:17
2004.10.03
Почему Ф-ция GetKeyNameText Возвращает символы


4-1092748880
Vasya.ru
2004-08-17 17:21
2004.10.03
Программа через автозапуск не работает


3-1094535962
Senator
2004-09-07 09:46
2004.10.03
RxDBLookupCombo


6-1090973055
Лев Ландау
2004-07-28 04:04
2004.10.03
Как вытащить текущее значение URL из TWebBrowser-a?





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