Ir para conteúdo
Fórum Script Brasil
  • 0

Deslocar Figura Dentro De Um Image


Paulo Nobre

Pergunta

Alguém saberia dizer como se faz para deslocar uma figura dentro de um componente imagem.

Explico melhor.

Em programas de imagens sofisticados(?), quando uma imagem(uma foto por exemplo) é maior na realidade do que um tamanho na tela(um componente imagem) o ponteiro assume a forma de uma mão e você pode deslocar a imagem dentro do componente de tal maneira que você possa vê-la totalmente.

Não tenho a menor idéia de como se faria isto até porque não tenho experiência quase nenhuma da parte gráfica do DELPHI.

Alguém já fez isso?

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Paulo, de uma maneira simples, daria para adicionar um ScrollBox (paleta Aditional) ao seu form e dentro dele colocar um Image (com align = alClient). O único inconveniente seria a presença das barras de rolagem quando a imagem for maior que a área de visualização. Meu form tem um Botão, um ScrollBox, um Image e um OpenPictureDialog. Também utilizo a unit jpeg 1.1(link)

O código ficaria assim:

  TForm1 = class(TForm)
  ...
  private
    SavedPoint :TPoint;
  ...
  end;

// abertura do arquivo de imagem
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
  // ajusta o scrollbox para o tamanho da imagem carregada
    ScrollBox1.HorzScrollBar.Range := Image1.Picture.Width;
    ScrollBox1.VertScrollBar.Range := Image1.Picture.Height;
  end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SavedPoint := Point(X, Y);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  X := ScrollBox1.HorzScrollBar.Position -(X -SavedPoint.X);
  Y := ScrollBox1.VertScrollBar.Position -(Y -SavedPoint.Y);

  if X < 0 then
    X := 0
  else if X > ScrollBox1.HorzScrollBar.Range then
    X := ScrollBox1.HorzScrollBar.Range;

  if Y < 0 then
    Y := 0
  else if Y > ScrollBox1.VertScrollBar.Range then
    Y := ScrollBox1.VertScrollBar.Range;

  ScrollBox1.HorzScrollBar.Position := X;
  ScrollBox1.VertScrollBar.Position := Y;
end;

p.s. só faltou trocar o ponteiro do mouse.

Link para o comentário
Compartilhar em outros sites

  • 0

Unit1.pas

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(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);
    procedure FormCreate(Sender: TObject);
  private
    procedure Load;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  BMP: TBitmap;
  P: TPoint;
  P_Clicked: TPoint;
  Clicked: Boolean = false;

implementation

{$R *.dfm}

procedure TForm1.Load;
var
  MyRect, MyOther: TRect;
begin

  MyRect := Rect(P.X, P.Y, P.X + Image1.Width, P.Y + Image1.Height);

  MyOther := Rect(0,0,Image1.Width, Image1.Height);
  Image1.Canvas.CopyRect(MyOther,BMP.Canvas,MyRect);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  P.X := 0;
  P.Y := 0;

  BMP := TBitmap.Create;
  BMP.LoadFromFile('C:\teste.bmp');

  Load;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  P_Clicked.X := X;
  P_Clicked.Y := Y;

  Clicked := True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Clicked = false then exit;
  
  P.X := P.X + (X - P_Clicked.X);
  P.Y := P.Y + (Y - P_Clicked.Y);

  if P.X < 0 then
    P.X := 0
  else if P.X > BMP.Width - Image1.Width then
    P.X := BMP.Width - Image1.Width;

  if P.Y < 0 then
    P.Y := 0
  else if P.Y > BMP.Height - Image1.Height then
    P.Y := BMP.Height - Image1.Height;

  P_Clicked.X := X;
  P_Clicked.Y := Y;

  Load;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Clicked := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
end;

end.
Unit1.dfm
object Form1: TForm1
  Left = 192
  Top = 107
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 8
    Top = 8
    Width = 521
    Height = 433
    Cursor = crHandPoint
    OnMouseDown = Image1MouseDown
    OnMouseMove = Image1MouseMove
    OnMouseUp = Image1MouseUp
  end
  object Button1: TButton
    Left = 536
    Top = 40
    Width = 75
    Height = 25
    Caption = 'Abrir'
    TabOrder = 0
    OnClick = Button1Click
  end
end

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, realmente o inconveniente são as barras de rolagem.

Mas, funcionou de maneira correta. O único porém é que a figura não desliza suavemente ao clicar nela e mover.

No código do CorN, a figura desliza suavemente exatamente como nos programas de figuras, cheguei a achar que tinha encontrado o código que queria(perfeito), mas ao baixar uma figura menor do que o tamanho do image se você clicar dentro do image o programa duplica a imagem. Não sei se alguém testou.

Link para o comentário
Compartilhar em outros sites

  • 0

pronto, terminei.

Unit1.pas

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(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);
    procedure FormCreate(Sender: TObject);
  private
    procedure Load;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  BMP: TBitmap;
  P: TPoint;
  P_Clicked: TPoint;
  Clicked: Boolean = false;

implementation

{$R *.dfm}

procedure TForm1.Load;
var
  MyRect, MyOther: TRect;
  X, Y: Integer;
begin
  if Image1.Width > BMP.Width then
    X := (Image1.Width - BMP.Width) div 2
  else X := 0;

  if Image1.Height > BMP.Height then
    Y := (Image1.Height - BMP.Height) div 2
  else Y := 0;

  MyRect := Rect(P.X, P.Y, P.X + Image1.Width, P.Y + Image1.Height);

  MyOther := Rect(X,Y,Image1.Width, Image1.Height);
  Image1.Canvas.CopyRect(MyOther,BMP.Canvas,MyRect);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  P.X := 0;
  P.Y := 0;

  BMP := TBitmap.Create;
  BMP.LoadFromFile('C:\teste.bmp');

  Load;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if BMP = nil then exit;

  P_Clicked.X := X;
  P_Clicked.Y := Y;

  Clicked := True;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Clicked = false then exit;
  
  P.X := P.X + (X - P_Clicked.X);
  P.Y := P.Y + (Y - P_Clicked.Y);

  if P.X < 0 then
    P.X := 0
  else if P.X > BMP.Width - Image1.Width then
    P.X := BMP.Width - Image1.Width;

  if P.Y < 0 then
    P.Y := 0
  else if P.Y > BMP.Height - Image1.Height then
    P.Y := BMP.Height - Image1.Height;

  if Image1.Width > BMP.Width then
    P.X := 0;

  if Image1.Height > BMP.Height then
    P.Y := 0;

  P_Clicked.X := X;
  P_Clicked.Y := Y;

  Load;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Clicked := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
end;

end.

Link para o comentário
Compartilhar em outros sites

  • 0

Beleza de código CorN_Sk8. É a versão menos simplista (oposto do que foi o meu post), mas muito mais precisa. Como observei que no seu exemplo o arquivo aberto sempre será um Bitmap (e acredito que o colega Paulo Nobre precisará abrir outros tipos), tenho a acrescentar o seguinte:

- Acrescente um componente TOpenPictureDialog;

- Adicione a unit Jpeg (citada no meu outro post) caso não tenha outra que permita abrir arquivos jpg e;

- Altere o código do CorN_Sk8 conforme abaixo.

procedure TForm1.Button1Click(Sender: TObject);
var
  Picture :TPicture;
begin
  P.X := 0;
  P.Y := 0;

  if OpenPictureDialog1.Execute then
  begin
    BMP := TBitmap.Create;
    Picture := TPicture.Create;
    try
      Picture.LoadFromFile(OpenPictureDialog1.FileName);
      BMP.Assign(Picture.Graphic);
    finally
      Picture.Free;
    end;

    Load;
  end;
end;

Como não ficou clara a aplicação que será dada a rotina, gostaria de observar ao colega Paulo Nobre que se o objetivo for apenas visualizar a imagem, o exemplo ficará completo, porém se o objetivo for editar a imagem (manipular os pixels) deve ser observado que na janela estará sendo visualizada uma cópia de parte da imagem original. Assim, qualquer alteração no fragmento da imagem visualizada terá que, de algum modo, ser repassado à original para quem sabe salvá-la.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Show de bola CorN, que beleza de código. Agora está funcionando bem.

Micheus beleza a sua observação: na realidade realmante vou ter que adaptar como você sugeriu para jpeg.

Por enquanto o programa é apenas para visualizar imagens a partir de um banco de dados. Um álbum de imagens simples.

Obrigado a vocês, aprendi muito.

[]s

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...