Delphi - Zoom a la backimage de un TChar

 
Vista:
sin imagen de perfil

Zoom a la backimage de un TChar

Publicado por Anel (78 intervenciones) el 11/09/2007 17:14:17
Hola:

necesito graficar sobre una imagen (plano) y estoy utilizando un TChar con una backimage. Pero necesito darle zoom. Como puedo hacer esto?

hay algun otro componente que lo permita?

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Zoom a la backimage de un TChar

Publicado por E.T. (1244 intervenciones) el 11/09/2007 23:34:43
Que es especificamente lo que graficas: formulas matematicas, estadisticas...

"PLANO", te refieres a un plano cartesiano???

Para eso del zoom, solo lo puedes hacer a las graficas la backimage siempre permanece igual, lo que se me ocurre, pero es algo laborioso, copias tu imagen de fondo a memoria, al "hacer zoom" copiarias parte del centro de la imagen (con el procedimiento BrushCopy) y la pegarias en el chart (el hacer esto la distorcionará), teniendo el BackImageMode como strech hará que parezca como un zoom, cuando en realidad solo estamos estirando la imagen.

No he encontrado forma de hacer zoom directamente a la imagen de fondo, tal ves no se pueda, pero no estoy seguro
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Zoom a la backimage de un TChar

Publicado por Anel (78 intervenciones) el 12/09/2007 17:57:55
me referia a un mapa. tengo que graficar sobre un mapa. son funciones gaussianas las que uso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Zoom a la backimage de un TChar

Publicado por E.T. (1244 intervenciones) el 13/09/2007 18:36:56
Nada mas dame un poco de tiempo, voy a intentar lo que te habia dicho de copiar partes de la imagen haber que te parece
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Zoom a la backimage de un TChar

Publicado por E.T. (1244 intervenciones) el 13/09/2007 19:59:53
Que tal, tengo algo, espero te sirva, puesdes hacer un "zoom", al hacer click dentro del chart y arrastrar el raton mientras tienes presionado el botón, se dibujará un rectángulo al soltar el botón sale un mensaje para confirmar que se quiere hacer el acercamiento, al darle que si te pondrá como BackImage la parte que has seleccionado del mismo chart, no se puede hacer zoom dentro de zoom, es decir, que si haces un zoom y luego otro haces otro este se hará en base a la imagen original, tendrias que darle al boton restaurar de la forma, necesitas un shape, un chart y un botón (el shape en su propiedad brush debe de tener: color=clwhite style=bsClear), no debes de cambiar el tamaño del chart en tiempo de ejecución, solo puedes hacerlo al crearse la forma por que si restauras la ventana se obtienen resultados inesperados, te puse una nota en el procedimiento de FormActivate,aqui te pego el codigo:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, Jpeg, StdCtrls;

type
TForm1 = class(TForm)
Chart1: TChart;
Shape1: TShape;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
imagen:Timage;
ImageBmp:TBitmap;
inix, iniy:integer;
pressed:boolean;
factorx, factory:real;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
//Form1.WindowState:=wsMaximized; //Puede o no ir esta linea
imagen:=TImage.Create(self);
imagen.Picture.LoadFromFile('c:\2.jpg');// NOTA aqui va el nombre de tu mapa
Chart1.BackImage.Assign(imagen.Picture);
ImageBmp:=TBitmap.Create;
ImageBmp.Assign(imagen.Picture.Graphic);
factorx:=imagen.Picture.Width/Chart1.Width;
factory:=imagen.Picture.Height/Chart1.Height;
pressed:=false;
imagen.Free;
Shape1.Visible:=false;
//ShowMessage(IntToStr(Chart1.Width)+' '+IntToStr(ImageBmp.Width)+' '+FloatToStr(factorx)+' '+FloatToStr(factory));
end;

procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Shape1.Left:=x;
Shape1.Top:=y;
inix:=x;
iniy:=y;
pressed:=true;
end;

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if pressed then begin
Shape1.Width:=x-inix;
Shape1.Height:=y-iniy;
Shape1.Visible:=true;
end;
end;

procedure TForm1.Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var ImageAux:TBitMap;
rectOrig,rectDest:TRect;
begin
pressed:=false;
Shape1.Visible:=false;
if MessageDlg('Hacer acercamiento?',mtConfirmation,[mbYes , mbNo],0)=mrYes then begin
ImageAux:=TBitmap.Create;
ImageAux.Width:=Trunc((X*factorx)-(inix*factorx));
ImageAux.Height:=Trunc((Y*factory)-(iniy*factory));
rectDest:=rect(0,0,ImageAux.width,ImageAux.height);
rectOrig:=rect(trunc(inix*factorx),trunc(iniy*factory),trunc(X*factorx),trunc(Y*factory));
ImageAux.Canvas.BrushCopy(rectDest,ImageBmp,rectOrig,clNone);
Chart1.BackImage.Assign(ImageAux);
ImageAux.Free;
end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
Chart1.BackImage.Assign(ImageBmp);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Chart1.BackImage.Assign(ImageBmp);
end;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Zoom a la backimage de un TChar

Publicado por E.T. (1244 intervenciones) el 13/09/2007 20:35:31
Que tal, resolví unos problemas que no tenia contemplados, además ya puedes hacer acercamientos sobre acercamientos, lo unico que falta es hacer "zoom out"

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, Jpeg, StdCtrls;

type
TForm1 = class(TForm)
Chart1: TChart;
Shape1: TShape;
Button1: TButton;
procedure FormActivate(Sender: TObject);
procedure Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
imagen:Timage;
ImageBmp, ImageAux:TBitmap;
inix, iniy:integer;
pressed:boolean;
factorx, factory:real;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
//Form1.WindowState:=wsMaximized;
imagen:=TImage.Create(self);
imagen.Picture.LoadFromFile('c:\1.jpg');
Chart1.BackImage.Assign(imagen.Picture);
ImageBmp:=TBitmap.Create;
ImageBmp.Assign(imagen.Picture.Graphic);
factorx:=imagen.Picture.Width/Chart1.Width;
factory:=imagen.Picture.Height/Chart1.Height;
pressed:=false;
imagen.Free;
Shape1.Visible:=false;
ImageAux:=TBitmap.Create;
ImageAux.Assign(ImageBmp);
//ImageAux.Free;
//ShowMessage(IntToStr(Chart1.Width)+' '+IntToStr(ImageBmp.Width)+' '+FloatToStr(factorx)+' '+FloatToStr(factory));
end;

procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Shape1.Left:=x;
Shape1.Top:=y;
inix:=x;
iniy:=y;
pressed:=true;
end;

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if pressed then begin
Shape1.Width:=x-inix;
Shape1.Height:=y-iniy;
Shape1.Visible:=true;
end;
end;

procedure TForm1.Chart1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var rectOrig,rectDest:TRect;
imageAux2:TBitmap;
xx,yy:integer;
begin
pressed:=false;
Shape1.Visible:=false;
if MessageDlg('Hacer acercamiento?',mtConfirmation,[mbYes , mbNo],0)=mrYes then begin
if x<inix then begin
xx:=inix;
inix:=x;
x:=xx;
end;
if y<iniy then begin
yy:=iniy;
iniy:=y;
y:=yy;
end;
ImageAux2:=TBitmap.Create;
ImageAux2.Width:=Trunc((X*factorx)-(inix*factorx));
ImageAux2.Height:=Trunc((Y*factory)-(iniy*factory));
rectDest:=rect(0,0,ImageAux2.width,ImageAux2.height);
rectOrig:=rect(trunc(inix*factorx),trunc(iniy*factory),trunc(X*factorx),trunc(Y*factory));
ImageAux2.Canvas.BrushCopy(rectDest,ImageAux,rectOrig,clNone);
Chart1.BackImage.Assign(ImageAux2);
ImageAux.Free;
ImageAux:=TBitmap.Create;
ImageAux.Assign(imageAux2);
factorx:=ImageAux.Width/Chart1.Width;
factory:=ImageAux.Height/Chart1.Height;
ImageAux2.Free;
end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
Chart1.BackImage.Assign(ImageBmp);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Chart1.BackImage.Assign(ImageBmp);
ImageAux.Assign(ImageBmp);
factorx:=ImageAux.Width/Chart1.Width;
factory:=ImageAux.Height/Chart1.Height;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ImageBmp.Free;
ImageAux.Free;
end;

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Zoom a la backimage de un TChar

Publicado por anel (78 intervenciones) el 17/09/2007 13:54:49
ok, mil gracias

lo probare
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar