Copiar um pedaço da Imagem
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
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
Curtidas 0
Respostas
Onjahyr
07/01/2008
http://www.efg2.com/Lab/Library/Delphi/Graphics/ComponentsAndPrograms.htm
Tudo o que vc precisa tá lá.
Tudo o que vc precisa tá lá.
GOSTEI 0
Emarcolongo
07/01/2008
onjahyr:
Muito obrigado, vou dar um olhada.
Valeu mesmo.
Muito obrigado, vou dar um olhada.
Valeu mesmo.
GOSTEI 0
Emarcolongo
07/01/2008
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
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
Emarcolongo
07/01/2008
Up
GOSTEI 0
Onjahyr
07/01/2008
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
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
Andersonbox
07/01/2008
Entra aí:
http://forum.devmedia.com.br/viewtopic.php?t=84467
Pra mim funcionou.
http://forum.devmedia.com.br/viewtopic.php?t=84467
Pra mim funcionou.
GOSTEI 0
Emarcolongo
07/01/2008
onjahyr, se vc puder disponibilizar eu agradeço;
GOSTEI 0
Marcosrocha
07/01/2008
[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:
GOSTEI 0
Emarcolongo
07/01/2008
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.
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
Marcosrocha
07/01/2008
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:
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
Emarcolongo
07/01/2008
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
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
Marcosrocha
07/01/2008
emarcolongo o seu problema não é a copia da imagem né? É só o desenho do quadrado?
GOSTEI 0
Emarcolongo
07/01/2008
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.
codigo é que deixa o desenho branco, ou seja, ele mantem o mesmo tam.
do original e eu queria somente a parte copiada.
GOSTEI 0
Marcosrocha
07/01/2008
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:
E depois fazer o FOR:
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:
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
Emarcolongo
07/01/2008
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.
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
Emarcolongo
07/01/2008
onjahyr
Se vc pude colocar o codigo para nós, somente o copiar/recortar, agradeço.
Até para aumentar nosso conhecimento.
Grato
Se vc pude colocar o codigo para nós, somente o copiar/recortar, agradeço.
Até para aumentar nosso conhecimento.
Grato
GOSTEI 0
Marcosrocha
07/01/2008
Então emarcolongo, o Branco do TImage aparece porque a proporção da imagem é maior que a cópia. Quando vamos inserir Pixels no TImage como Bitmap, por padrão, o componente preenche o espaço restante com a Cor Branca, padrão do Brush do Canvas. Eu tentei fazer algumas modificações para remover este Branco mas o que você vai ter que fazer é utilizar o CopyRect
Não testei ainda mas deve resolver.
Image2.Canvas.CopyRect( Rect(0,0,Image2.Width,Image2.Height), Image1.Canvas, Rect( 0, 0, Image1.Picture.Width-50, Image1.Picture.Height-50));
Não testei ainda mas deve resolver.
GOSTEI 0
Emarcolongo
07/01/2008
mcblade
Eu consegui resolver de outra forma, na verdade foi falta de raciocinar
minha, eu preciso definir o tamanho do image2 antes da copia
e assim ele funciona, veja como ficou o código:
Eu consegui resolver de outra forma, na verdade foi falta de raciocinar
minha, eu preciso definir o tamanho do image2 antes da copia
e assim ele funciona, veja como ficou o código:
var i,j,x1,x2,y1,y2 : integer; begin x1 := dspadrao.dataset.fieldbyname(´x1´).value; x2 := dspadrao.dataset.fieldbyname(´x2´).value; y1 := dspadrao.dataset.fieldbyname(´y1´).value; y2 := dspadrao.dataset.fieldbyname(´y2´).value; Image2.Height := y2-y1; Image2.Width := x2-x1; for i := y1 to y2 do for j := x1 to x2 do Image2.Canvas.Pixels[(j-x1),(i-y1)] := Image1.Canvas.Pixels[j,i]; Image2.picture.savetofile(´c:\teste.bmp´); end;
GOSTEI 0
Marcosrocha
07/01/2008
Isso mesmo emarcolongo, funcionou perfeiramente... Bom trabalho! :wink:
GOSTEI 0
Emarcolongo
07/01/2008
Obrigado pela ajuda...
GOSTEI 0