GARANTIR DESCONTO

Fórum Copiar um pedaço da Imagem #351502

07/01/2008

0

Amigos, estou com uma duvida.

Na minha aplicação tenho um TImage com um bmp carregado.
Gostaria de clicar em 4 pontos (para formar um quadrado) e jogar
para um Image2.
Para esclarecer, vamos supor que minha imagem tem 800x600,
quero recortar um quadrado que no meu imagem2 fique com a
area 400x300 da figura original.
Seria interessante, se por exemplo eu pudesse desenhar um
quadrado na imagem1 e o quadrado que eu fiz aparecer na image2.

Grato


Emarcolongo

Emarcolongo

Responder

Posts

10/01/2008

Onjahyr

http://www.efg2.com/Lab/Library/Delphi/Graphics/ComponentsAndPrograms.htm

Tudo o que vc precisa tá lá.


Responder

Gostei + 0

10/01/2008

Emarcolongo

onjahyr:

Muito obrigado, vou dar um olhada.
Valeu mesmo.


Responder

Gostei + 0

14/01/2008

Emarcolongo

onjahyr, obrigado pela ajuda mais ainda não é isto.
a maioria dos links levam para componentes. gostaria de algo nativo.

hoje consigo criar desenhar um retangulo em minha imagem,
então tenho o x e y inicias e x e y finais

gostaria de saber como copiar a imagem destas coordenadas
para um outro timage.

grato


Responder

Gostei + 0

23/01/2008

Emarcolongo

Up


Responder

Gostei + 0

24/01/2008

Onjahyr

Ok, desculpa a demora....

Eu sei fazer isso sim, selecionar (com o mouse) uma determinada área de um bitmap (figura) e salvar num arquivo ou jogar para dentro de uma outra TImage....

Se você ainda não conseguiu resolver, dê um grito que eu coloco o processo aqui...

Não coloquei porquê estou sem tempo agora, e, talvez já tenha solucionado o caso. Mas eu sei como fazer sim

Alias, eu tenho os fontes de um Editor Gráfico completo, (Fontes em Delphi7) parecido com o PhotoShop.



Blz


Responder

Gostei + 0

24/01/2008

Andersonbox

Entra aí:

http://forum.devmedia.com.br/viewtopic.php?t=84467

Pra mim funcionou.


Responder

Gostei + 0

25/01/2008

Emarcolongo

onjahyr, se vc puder disponibilizar eu agradeço;


Responder

Gostei + 0

25/01/2008

Marcosrocha

[b:48008c30af]emarcolongo[/b:48008c30af] o Link que o [b:48008c30af]andersonbox[/b:48008c30af] postou tem a solução, você deu uma olhada? Basta apenas modificar para o que você quer, ou você está esperando que alguém lhe dê a rotina pronta, testada e aprovada pelo Inmetro? :lol:


Responder

Gostei + 0

25/01/2008

Emarcolongo

mcblade

Antes de postar algo eu costumo procurar e já tinha achado a resposta
dele para vc.
Usei o codigo indicado no link e não ajudou nesta minha aplicação,
por que o fundo da imagem2 fica branco e ai quando dou um savefile este
fundo aparece além disto a imagem aparece deslocada, porque ele
não recorta e sim copia uma parte da minha deixando os dois imagens
com o mesmo tamanho.
o processo é interessante, mas estou em busca do que é melhor
para minha aplicação, talvez o codigo do onjahyr seja melhor para
mim, vc pensou nisto ?. :lol:
Se vc conseguiu solucionar isto, por favor post em vez de perder
o seu tempo me criticando.


Responder

Gostei + 0

25/01/2008

Marcosrocha

Tranquilo [b:55aeb11c4d]emarcolongo[/b:55aeb11c4d] desulpa a crítica mas é que eu já estava aborrecido com um outro membro que tá na boca da comunidade que não tem noção nenhuma e tá querendo que façamos o trabalho todo pra ele (convenhamos que isso não é legal pra quem está aprendendo).
Eu também procuro manipulação de imagens para um projeto particular mas ainda não achei o que procurava e também não estou correndo atrás. Mas... A imagem que você está salvando em arquivo é Bitmap?
Porque teoricamente se você copiar pedaço da imagem de outro Image, Pixel por Pixel, você teria um recorte. Mas se você está tentando salvar em .gif, acho que a imagem vai ter que passar uma conversão, se não me engano pra MetaFile, para que a transparência funcione. Tem alguns códigos no Torry que mostram como manipular imagens.
http://www.swissdelphicenter.ch/torry/grafik.php

Mais uma vez, me desulpe pelo incoveniente. :oops:


Responder

Gostei + 0

25/01/2008

Emarcolongo

mcblade

Obrigado pelo link, ainda não dei uma olhada em tudo, mas vou verificar e
te falo o que consegui.
Fiz o exemplo seguindo o link anterior da seguinte forma
Coloquei dois images, o primeiro com uma imagem bmp e o segundo
sem imagem, não alterei nenhuma propriedade mais.
Coloquei um button e o codigo do link, o resultado no image2 realmente
foi do pedaço que eu quis copiar mas o restante da imagem ficou branca,
como seu fosse uma borda, ai dei um savefile do image2.
Meu, me desculpe também por qq coisa é que este projeto tá me
tirando o sono. Espero poder te ajudar assim como vc esta me ajudando.
Abraços


Responder

Gostei + 0

25/01/2008

Marcosrocha

emarcolongo o seu problema não é a copia da imagem né? É só o desenho do quadrado?


Responder

Gostei + 0

26/01/2008

Emarcolongo

Com o codigo anterior copiar a imagem esta certo. o problema daquele
codigo é que deixa o desenho branco, ou seja, ele mantem o mesmo tam.
do original e eu queria somente a parte copiada.


Responder

Gostei + 0

26/01/2008

Marcosrocha

Como você tá Gravando os Pontos do Mouse?
No exemplo que eu fiz em casa foi o seguinte. Criei duas variáveis (pInicio e pFim) do tipo TPoint e ai no MouseDown e MouseUp:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  pInicio.X := X;
  pInicio.Y := Y;
end;

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

E depois fazer o FOR:
for I := pInicio.X to pFim.X do 
  for J := pInicio.Y to pFim.Y do 
    Image2.Canvas.Pixels[I, J] := Image1.Canvas.Pixels[I, J];

O resto depende de adaptações suas... eu Fiz no MouseUp porque estava tentando desenhar o retângulo pontilhado enquanto o usuário vai arrastando o mouse com o botao esquerdo clicado mas to tentando resolver um probleminha com meu amiguinho Canvas...
Qualquer coisa posta ai... :wink:


Responder

Gostei + 0

28/01/2008

Emarcolongo

Mcblade

Abaixo esta a unit que uso para capturar os pontos.
Inclusive isto que vc quer de desenhar um retângulo com o botão
direito clicado é feito também.
Espero que possa te ajudar em alguma coisa.

unit upoints;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, ExtCtrls, StdCtrls, ComCtrls, Menus, jpeg, Clipbrd, Grids;

type
  TDrawingTool = (dtLine, dtRectangle, dtEllipse, dtRoundRect);
  Tfpoints = class(TForm)
    Panel1: TPanel;
    StringGrid1: TStringGrid;
    BitBtn2: TBitBtn;
    StatusBar1: TStatusBar;
    RectangleButton: TSpeedButton;
    image: TImage;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure imageMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure imageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure RectangleButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
  points : array [1..4] of integer;
  Origin, MovePt: TPoint;
  Drawing: Boolean;
  DrawingTool: TDrawingTool;
  procedure DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
    { Public declarations }
  end;

var
  fpoints: Tfpoints;

implementation

uses uprincipal;

{$R *.dfm}

procedure Tfpoints.FormCreate(Sender: TObject);
begin
image.picture.loadfromfile(extractfilepath(application.exename)+´image\image.bmp´);
stringgrid1.cells[0,0] := ´Vaga´;
stringgrid1.cells[1,0] := ´Inicial X´;
stringgrid1.cells[2,0] := ´Inicial Y´;
stringgrid1.cells[3,0] := ´Final X´;
stringgrid1.cells[4,0] := ´Final Y´;
drawingtool := dtrectangle;
end;

procedure Tfpoints.BitBtn2Click(Sender: TObject);
begin
close;
end;

procedure Tfpoints.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Drawing := True;
  Image.Canvas.MoveTo(X, Y);
  Origin := Point(X, Y);
  points[1] := x;
  points[2] := y;
  MovePt := Origin;
  StatusBar1.Panels[0].Text := Format(´Origin: (¬d, ¬d)´, [X, Y]);
end;

procedure Tfpoints.imageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Drawing then
  begin
    DrawShape(Origin, MovePt, pmNotXor);
    MovePt := Point(X, Y);
    DrawShape(Origin, MovePt, pmNotXor);
  end;
  StatusBar1.Panels[1].Text := Format(´Current: (¬d, ¬d)´, [X, Y]);
end;

procedure Tfpoints.imageMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Drawing then
  begin
    points[3] := x;
    points[4] := y;
    Drawing := False;
  end;
  stringgrid1.cells[0,(stringgrid1.rowcount-1)] := uppercase(inputbox(´Vagas´,´Nome da Vaga:´,´´));
  stringgrid1.cells[1,(stringgrid1.rowcount-1)] := inttostr(points[1]);
  stringgrid1.cells[2,(stringgrid1.rowcount-1)] := inttostr(points[2]);
  stringgrid1.cells[3,(stringgrid1.rowcount-1)] := inttostr(points[3]);
  stringgrid1.cells[4,(stringgrid1.rowcount-1)] := inttostr(points[4]);
  stringgrid1.rowcount := (stringgrid1.rowcount + 1);
end;

procedure Tfpoints.DrawShape(TopLeft, BottomRight: TPoint;
  AMode: TPenMode);
begin
  with Image.Canvas do
  begin
    Pen.Mode := AMode;
    case DrawingTool of
      dtLine:
        begin
          Image.Canvas.MoveTo(TopLeft.X, TopLeft.Y);
          Image.Canvas.LineTo(BottomRight.X, BottomRight.Y);
        end;
      dtRectangle: Image.Canvas.Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X,
        BottomRight.Y);
      dtEllipse: Image.Canvas.Ellipse(Topleft.X, TopLeft.Y, BottomRight.X,
        BottomRight.Y);
      dtRoundRect: Image.Canvas.RoundRect(TopLeft.X, TopLeft.Y, BottomRight.X,
        BottomRight.Y, (TopLeft.X - BottomRight.X) div 2,
        (TopLeft.Y - BottomRight.Y) div 2);
    end;
  end;
end;

procedure Tfpoints.RectangleButtonClick(Sender: TObject);
begin
DrawingTool := dtRectangle;
end;

end.



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar