Fórum Copiar um pedaço da Imagem #351502
07/01/2008
0
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
Curtir tópico
+ 0Posts
10/01/2008
Onjahyr
Tudo o que vc precisa tá lá.
Gostei + 0
10/01/2008
Emarcolongo
Muito obrigado, vou dar um olhada.
Valeu mesmo.
Gostei + 0
14/01/2008
Emarcolongo
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
Gostei + 0
23/01/2008
Emarcolongo
Gostei + 0
24/01/2008
Onjahyr
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
Gostei + 0
24/01/2008
Andersonbox
http://forum.devmedia.com.br/viewtopic.php?t=84467
Pra mim funcionou.
Gostei + 0
25/01/2008
Emarcolongo
Gostei + 0
25/01/2008
Marcosrocha
Gostei + 0
25/01/2008
Emarcolongo
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.
Gostei + 0
25/01/2008
Marcosrocha
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:
Gostei + 0
25/01/2008
Emarcolongo
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
Gostei + 0
25/01/2008
Marcosrocha
Gostei + 0
26/01/2008
Emarcolongo
codigo é que deixa o desenho branco, ou seja, ele mantem o mesmo tam.
do original e eu queria somente a parte copiada.
Gostei + 0
26/01/2008
Marcosrocha
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:
Gostei + 0
28/01/2008
Emarcolongo
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)