PDA

Ver la Versión Completa : Mover Imagen


chinnamasta
22-06-2012, 13:40:33
hola club delphi

deseo trasladar una imagen que tengo alojada en un timage y deseo trasladarla con información dada en dos tlabel uno para la posición en "x" y otro para la posición en "y". ya lo intente de varias maneras sin tener exito la ultima manera en la que si se mueve la imagen so se detiene se mueve de manera infinita :confused::confused::confused:

despues quiero hacer que rote y que se escale pero estas no las e intentado :p
espero que se resuelva mi problema pronto gracias

les anexo el prog que tengo:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtDlgs, ExtCtrls, ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Archivo1: TMenuItem;
Abrir1: TMenuItem;
OPD1: TOpenPictureDialog;
StatusBar1: TStatusBar;
ScrollBox1: TScrollBox;
Image1: TImage;
Basicos1: TMenuItem;
Negativo1: TMenuItem;
StatusBar2: TStatusBar;
Label1: TLabel;
ProgressBar1: TProgressBar;
Grises1: TMenuItem;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
ranformaciones1: TMenuItem;
raslacion1: TMenuItem;
Rotacion1: TMenuItem;
Escalacion1: TMenuItem;
Edit5: TEdit;
Label6: TLabel;
Label7: TLabel;
Edit6: TEdit;
procedure Abrir1Click(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Negativo1Click(Sender: TObject);
procedure Grises1Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure raslacion1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
nomarch:string;
ancho, alto:integer;
X1,X2,Y1,Y2:integer;


implementation

{$R *.dfm}

procedure TForm1.Abrir1Click(Sender: TObject);
begin
if OPD1.Execute then begin
nomarch:=OPD1.FileName;
image1.Picture.LoadFromFile(nomarch);
ancho:=Image1.Width;
alto:=Image1.Height;

Edit1.Text:='0';
Edit2.Text:='0';
Edit3.Text:=IntToStr(ancho);
Edit4.Text:=IntToStr(alto);
StatusBar2.Panels[1].Text:=IntToStr(ancho);
StatusBar2.Panels[3].Text:=IntToStr(alto);
StatusBar2.Panels[4].Text:=nomarch;
end;
end;

procedure TForm1.Grises1Click(Sender: TObject);
var
pix,r,g,b,gris:integer;
i,j:integer;
begin
X1:=StrToInt(edit1.Text);
X2:=StrToInt(edit3.Text);
Y1:=StrToInt(edit2.Text);
Y2:=StrToInt(edit4.Text);

ProgressBar1.Max:=X2-X1;
for i := X1 to X2 do begin
for j := Y1 to Y2 do begin
pix:=Image1.Canvas.Pixels[i,j];
r:=pix and $FF;
g:=(pix and $FF00) shr 8;
b:=(pix and $FF0000) shr 16;

gris:=round((r+g+b)/3);
r:=gris;
g:=gris;
b:=gris;

pix:=r or (g shl 8) or (b shl 16);
Image1.Canvas.Pixels[i,j]:=pix;


end;
ProgressBar1.StepIt;
end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if RadioButton1.Checked then begin
Edit1.Text:=IntToStr(x);
Edit2.Text:=IntToStr(y);
end
else begin
Edit3.Text:=IntToStr(x);
Edit4.Text:=IntToStr(y);
end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
pix,r,g,b:integer;
begin
pix:=Image1.Canvas.Pixels[x,y];
r:=pix and $FF;
g:=(pix and $FF00) shr 8;
b:=(pix and $FF0000) shr 16;
StatusBar1.Panels[1].Text:=IntToStr(X);
StatusBar1.Panels[3].Text:=IntToStr(Y);
StatusBar1.Panels[5].Text:=IntToStr(R);
StatusBar1.Panels[6].Text:=IntToStr(G);
StatusBar1.Panels[7].Text:=IntToStr(B);

end;

procedure TForm1.Negativo1Click(Sender: TObject);
var
pix,r,g,b:integer;
i,j:integer;
begin
X1:=StrToInt(edit1.Text);
X2:=StrToInt(edit3.Text);
Y1:=StrToInt(edit2.Text);
Y2:=StrToInt(edit4.Text);

ProgressBar1.Max:=X2-X1;
for i := X1 to X2 do begin
for j := Y1 to Y2 do begin
pix:=Image1.Canvas.Pixels[i,j];
r:=pix and $FF;
g:=(pix and $FF00) shr 8;
b:=(pix and $FF0000) shr 16;
r:=255-r;
g:=255-g;
b:=255-b;

pix:=r or (g shl 8) or (b shl 16);
Image1.Canvas.Pixels[i,j]:=pix;

end;
ProgressBar1.StepIt;
end;
end;
procedure TForm1.raslacion1Click(Sender: TObject);
var
pix,r,g,b,trasladar1,trasladar2,trasladar3,trasladar4:integer;
i,j,h,y:integer;
trasladarx,trasladary:integer;
begin
X1:=StrToInt(edit1.Text);
X2:=StrToInt(edit3.Text);
Y1:=StrToInt(edit2.Text);
Y2:=StrToInt(edit4.Text);
trasladarx:=StrToInt(edit5.Text);
trasladary:=StrToInt(edit6.Text);

ProgressBar1.Max:=X2-X1;
for i := X1 to X2 do begin
for j := Y1 to Y2 do begin
pix:=Image1.Canvas.Pixels[i,j];
Image1.Left:=Image1.Left + trasladarx;
Image1.Top:=Image1.Top + trasladary;
Image1.Canvas.Pixels[i,j]:=pix;
end;
ProgressBar1.StepIt;
end;
end;
end.

como pueden ver el programa tiene filtros y tendra mas filtros

Ñuño Martínez
22-06-2012, 21:03:54
Bienvenido al Club. Veo que es muy probable que te hayas leído la Guía de Estilo (http://www.clubdelphi.com/foros/guiaestilo.php), así que no te diré que te la leas... por ahora. ;)

Con este código:

Image1.Left:=Image1.Left + trasladarx;
Image1.Top:=Image1.Top + trasladary;
Lo que estás haciendo es incrementando la posición de la imagen, de ahí que se mueva contínuamente. En principio, con asignarlo así:

Image1.Left:= trasladarx;
Image1.Top:= trasladary;
debería bastar. Te recomiendo que en el constructor asignes a los campos de texto los valores "Left" y "Top".

Y otro consejo: Pon nombres significativos a los componentes, nunca uses los nombres por defecto. Te harán la vida muchísimo más fácil.

chinnamasta
27-06-2012, 18:49:54
Muchas gracias Ñuño Martinez si logre hacer que la imagen se moviera gracias al código que me aconsejaste corregir ademas de por mis propios medios lograr escalar la imagen. Ahora tengo Otros problemas pero creo que mayores, jeje :D:D

ElDioni
28-06-2012, 12:19:15
Hola,

para el tema de rotar te adelanto que en el club hay un truco para el caso.

http://www.clubdelphi.com/trucos/index.php?id=455&scroll=0&scrollb=17

Saludos.