 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Sex Abr 19, 2019 2:54 pm Assunto: selecionar / recortar em Timage |
|
|
pessoal tenho uma Timage e nela eu desenho com canvas... e precisava criar uma ferramenta que para que possa selecionar uma parte do desenho e arrastar para onde quiser (igual a ferramenta selecionar do PAINT)..
andei pesquisando mas nao chegei a nada... |
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Abr 22, 2019 12:57 pm Assunto: |
|
|
vamos lá então.
a função para copiar a parte selecionada para um outro canvas será o
Canvas.CopyRect(DestRect, OrigCanvas, OrigRect);
onde:
DestRect é a regiao onde a copia será colocada (coordenadas da regiao)
OrigCanvas de onde regiao sera copiada (canvas)
OrigRect é a região de onde será copiada (coordenadas da regiao)
para o inicio copia pode registar o evento mousedown o registro das coordenadas x , y que marcará o inicio da copia
para o fim da copia e conclusão da copia pode registar o evento mouseup das coordenadas x, y que marcará o fim da copia
um vez que tentas as coordenadas x, y iniciais e x,y finais pode ter ai a regiao do corte e por sua vez da copia.
ententender o corte se é de fato que ocoore!
na verdade não existe um corte na imagem original o que ocorre é o seguinte uma vez que sabia as coordenadas iniciais e finais o que se faz é algo bem simples.
copia aquela regiao para um canvas temporario o uqla possibilitara seu redesenho em outra possição da imagem, na regiao original do canvas original é que é pintado de um cor branca, ou qualquer outra cor que indique a cor do fundo.
desta forma como a rigiao original foi pintado da cor do fundo e que ante desta pintura o que estava la antes foi passado para um canvas temporario é a ideia de corte, pelo menos é o que aparenta visualmente.
mover o recorte para outra posição
isso ja é mais dinamico e um pouco mais complexo
sua aplicação precisa reconhecer ações do tipo recortar e mover para conseguir de fato consguir aplictar esta funcionalidade, pois
o evento mousedown neste apstecto tb é usado alem do evento mousemove.
precisa rconhecer que o mouse foi precionado em cima do recorte, assim como tb precisa reconhecer que o mouse voi movimentado
para então mudar as coordenadas iniciais e finais do recorte.
bom é isso, a teoria baseia nestes aspecto.
ja devo ter postado alguns exemplo, não com estas finalidade mais com finalidade similares dá um procurada aqui mesmo no forum algo que eu tenha postado acreito que vai encontra muita coisa que possa te ajudar nesta tarefa.
boa sorte. _________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Seg Abr 22, 2019 9:44 pm Assunto: |
|
|
| strak2012 escreveu: | vamos lá então.
a função para copiar a parte selecionada para um outro canvas será o
Canvas.CopyRect(DestRect, OrigCanvas, OrigRect);
onde:
DestRect é a regiao onde a copia será colocada (coordenadas da regiao)
OrigCanvas de onde regiao sera copiada (canvas)
OrigRect é a região de onde será copiada (coordenadas da regiao)
para o inicio copia pode registar o evento mousedown o registro das coordenadas x , y que marcará o inicio da copia
para o fim da copia e conclusão da copia pode registar o evento mouseup das coordenadas x, y que marcará o fim da copia
um vez que tentas as coordenadas x, y iniciais e x,y finais pode ter ai a regiao do corte e por sua vez da copia.
ententender o corte se é de fato que ocoore!
na verdade não existe um corte na imagem original o que ocorre é o seguinte uma vez que sabia as coordenadas iniciais e finais o que se faz é algo bem simples.
copia aquela regiao para um canvas temporario o uqla possibilitara seu redesenho em outra possição da imagem, na regiao original do canvas original é que é pintado de um cor branca, ou qualquer outra cor que indique a cor do fundo.
desta forma como a rigiao original foi pintado da cor do fundo e que ante desta pintura o que estava la antes foi passado para um canvas temporario é a ideia de corte, pelo menos é o que aparenta visualmente.
mover o recorte para outra posição
isso ja é mais dinamico e um pouco mais complexo
sua aplicação precisa reconhecer ações do tipo recortar e mover para conseguir de fato consguir aplictar esta funcionalidade, pois
o evento mousedown neste apstecto tb é usado alem do evento mousemove.
precisa rconhecer que o mouse foi precionado em cima do recorte, assim como tb precisa reconhecer que o mouse voi movimentado
para então mudar as coordenadas iniciais e finais do recorte.
bom é isso, a teoria baseia nestes aspecto.
ja devo ter postado alguns exemplo, não com estas finalidade mais com finalidade similares dá um procurada aqui mesmo no forum algo que eu tenha postado acreito que vai encontra muita coisa que possa te ajudar nesta tarefa.
boa sorte. |
opa..
eu estou tentando assim:
image2.onmousedown
| Código: |
IsDown := true;
StartX := x;
StartY := y;
OldStartX := x;
OldStartY := y;
OldEndX := x;
OldEndY := y;
|
image2.onmousemove
| Código: | if sb2.Down = true then
Begin
if IsDown then
begin
Image2.Picture.Bitmap.Canvas.Pen.Color := clBlack;
Image2.Picture.Bitmap.Canvas.Pen.Width := 1;
image2.Picture.Bitmap.Canvas.Pen.Style := psDot;
image2.Picture.Bitmap.Canvas.Brush.Style :=bsclear ;
Image2.Picture.Bitmap.Canvas.Pen.Mode := pmNotXor;
Image2.Picture.Bitmap.Canvas.Rectangle(OldStartX, OldStartY,
OldEndX, OldEndY);
OldEndX := x;
OldEndY := y;
Image2.Picture.Bitmap.Canvas.Rectangle(StartX, StartY, x, y);
end;
End;
|
image2.onmouseup
| Código: | if sb2.Down = true then
begin
IsDown := false;
image2.Picture.Bitmap.canvas.Brush.Style:= bsClear;
image2.Picture.Bitmap.Canvas.Pen.Style := psDot;
Image2.Picture.Bitmap.Canvas.Pen.Mode := pmMask;
Image2.Picture.Bitmap.Canvas.Rectangle(OldStartX, OldStartY,
OldEndX, OldEndY);
if not (Image2.Picture.Bitmap is TBitmap) then
raise Exception.Create('A imagem não é um Bitmap');
Bmp2 := TBitmap(Image2.Picture.Bitmap);
Bmp1 := TBitmap.Create;
try
Bmp1.Width := Abs(OldEndX - OldStartX);
Bmp1.Height := Abs(OldEndY - OldStartY);
image4.width := Abs(OldEndX - OldStartX);
image4.Height := Abs(OldEndY - OldStartY);
if OldStartX < oldendX then
begin
image4.Top :=( OldStarty -2);
Image4.Left :=( OldStartx -2);
end
else
begin
image4.Top :=( Oldendy -2 );
Image4.Left :=( Oldendx -2) ;
end;
Bmp1.Canvas.CopyRect(Rect(0, 0, Bmp1.Width, Bmp1.Height), Bmp2.Canvas, Rect(OldStartX, OldStartY, OldEndX, OldEndY));
image4.Picture.Bitmap.Assign(bmp1);
image4.Transparent := true;
finally
Bmp1.Free;
end;
|
com estes codigos acima eu desenho um retangulo e copio o retangulo para uma image4....
aonde consigo movimentar a image4 com estes codigos abaixo
image4.onmousedown
| Código: | if Button <> mbLeft then
Exit;
ClicouNaImagem := true;
iLeft := Mouse.CursorPos.x;
iTop := Mouse.CursorPos.y; |
image4.onmousemove
| Código: | if not ClicouNaImagem then
Exit;
Image4.Left := Image4.Left - iLeft + Mouse.CursorPos.x;
Image4.Top := Image4.Top - iTop + Mouse.CursorPos.y;
iLeft := Mouse.CursorPos.x;
iTop := Mouse.CursorPos.y;
|
image4.onmouseup
| Código: | | ClicouNaImagem := false; |
assim consigo movimentar a imagem para qualquer lugar sobre a image2...
porem so me falta achar um meio de quando clicar fora da image4 o desenho da image4 copiar para a image2 exatamente na posicao em que o usuario largou.. |
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Abr 22, 2019 10:07 pm Assunto: |
|
|
Podes usar o mesmo metodo que usaste para copiar, pode tb usar para fundir as partes, desta vez levando em conta as novas coordenada e trocando as posição dos canvas o que teve a copia e o que foi copiado exemplo:
para copiar
canva_que_recebe_recorte.CopyRect(DestRect, Canvas_de_onde_se_copia, OrigRect);
para colar ou fundir
Canvas_de_onde_se_copia.CopyRect(DestRect, canva_que_recebe_recorte, OrigRect);
lembre que DestRect são coordenadas para onde a grafica vai ser jogada e que
OrigRect é as coordenada de onde foi copiada a grafica.
logo deve ter cuisado pois vai precisar tb trocar ambas coordendas
pensando um pouco.
inicialmente copiaste de uma imagem maior uma regiao menor.
alocaste esta regiao em um recurso qualquer e moveste este recurso.
agora precisa que este recurso faça novamente parte da imagem maior.
assim sendo onde tiver DestRect deve ficar algo do tipo
rect(image4.left,image4.top,image4.left+image4.width,image4.top+image4.height) // coordenada da image4 em relação a original
ja o OrigRect fica
rect(0,0,image4.width,image4.height) // ou seja toda a gafica presente em image4 será agora a origem.
legal não?
a função que seleciona para o corte tb serve para o colar. _________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Seg Abr 22, 2019 10:23 pm Assunto: |
|
|
| strak2012 escreveu: | Podes usar o mesmo metodo que usaste para copiar, pode tb usar para fundir as partes, desta vez levando em conta as novas coordenada e trocando as posição dos canvas o que teve a copia e o que foi copiado exemplo:
para copiar
canva_que_recebe_recorte.CopyRect(DestRect, Canvas_de_onde_se_copia, OrigRect);
para colar ou fundir
Canvas_de_onde_se_copia.CopyRect(DestRect, canva_que_recebe_recorte, OrigRect);
lembre que DestRect são coordenadas para onde a grafica vai ser jogada e que
OrigRect é as coordenada de onde foi copiada a grafica.
logo deve ter cuisado pois vai precisar tb trocar ambas coordendas
pensando um pouco.
inicialmente copiaste de uma imagem maior uma regiao menor.
alocaste esta regiao em um recurso qualquer e moveste este recurso.
agora precisa que este recurso faça novamente parte da imagem maior.
assim sendo onde tiver DestRect deve ficar algo do tipo
rect(image4.left,image4.top,image4.left+image4.width,image4.top+image4.height) // coordenada da image4 em relação a original
ja o OrigRect fica
rect(0,0,image4.width,image4.height) // ou seja toda a gafica presente em image4 será agora a origem.
legal não?
a função que seleciona para o corte tb serve para o colar. |
legal .. estava com dificuldade para o DestRect ..mas ficou assim..
| Código: |
image2.Picture.Bitmap.Canvas.CopyRect(Rect(image4.left,image4.top,image4.left+image4.width,image4.top+image4.height),
image4.Picture.Bitmap.Canvas, Rect(0, 0, image4.Width, image4.Height));
|
deste modo eu estou copiando o as cordenadas OldstartX, OldStartY, OldendX,OldendY ... porem falta apagar estas cordenadas na image2 ..
como posso fazer isto?? |
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Abr 22, 2019 10:28 pm Assunto: |
|
|
| Citação: | deste modo eu estou copiando o as cordenadas OldstartX, OldStartY, OldendX,OldendY ... porem falta apagar estas cordenadas na image2 ..
como posso fazer isto?? |
não entendi muito bem a pergunta.
copiaste moveste e colaste mais a parte de onde copiou permanace é isso?
se sim no momento da copia copia quando estar a passtar a grafica de image2 para image4 deve copiar e em seguida pintar um retangle de cor que simbulize a cor do fundo tipo branco ou preto por exemplo e só depois é que em image4 pode mover e ve que lá ficou um quadro branco ou preto ou a cor que usaste para a cor do fundo. _________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Seg Abr 22, 2019 10:37 pm Assunto: |
|
|
| strak2012 escreveu: | | Citação: | deste modo eu estou copiando o as cordenadas OldstartX, OldStartY, OldendX,OldendY ... porem falta apagar estas cordenadas na image2 ..
como posso fazer isto?? |
não entendi muito bem a pergunta.
copiaste moveste e colaste mais a parte de onde copiou permanace é isso?
se sim no momento da copia copia quando estar a passtar a grafica de image2 para image4 deve copiar e em seguida pintar um retangle de cor que simbulize a cor do fundo tipo branco ou preto por exemplo e só depois é que em image4 pode mover e ve que lá ficou um quadro branco ou preto ou a cor que usaste para a cor do fundo. |
ah ok .. exatamente isso.. vou testar.. vlw |
|
| Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Qui Abr 25, 2019 7:27 pm Assunto: |
|
|
| strak2012 escreveu: | | Citação: | deste modo eu estou copiando o as cordenadas OldstartX, OldStartY, OldendX,OldendY ... porem falta apagar estas cordenadas na image2 ..
como posso fazer isto?? |
não entendi muito bem a pergunta.
copiaste moveste e colaste mais a parte de onde copiou permanace é isso?
se sim no momento da copia copia quando estar a passtar a grafica de image2 para image4 deve copiar e em seguida pintar um retangle de cor que simbulize a cor do fundo tipo branco ou preto por exemplo e só depois é que em image4 pode mover e ve que lá ficou um quadro branco ou preto ou a cor que usaste para a cor do fundo. |
boa noite..
estou com um problema..
| Código: |
if sb2.Down = true then
begin
IsDown := false;
image2.Picture.Bitmap.canvas.Brush.Style:= bsClear;
image2.Picture.Bitmap.Canvas.Pen.Style := psDot;
Image2.Picture.Bitmap.Canvas.Pen.Mode := pmMask;
Image2.Picture.Bitmap.Canvas.Rectangle(OldStartX, OldStartY,
OldEndX, OldEndY);
if not (Image2.Picture.Bitmap is TBitmap) then
raise Exception.Create('A imagem não é um Bitmap');
Bmp2 := TBitmap(Image2.Picture.Bitmap);
Bmp1 := TBitmap.Create;
try
Bmp1.Width := Abs(OldEndX - OldStartX);
Bmp1.Height := Abs(OldEndY - OldStartY);
image4.width := Abs(OldEndX - OldStartX);
image4.Height := Abs(OldEndY - OldStartY);
if OldStartX < oldendX then
begin
image4.Top :=( OldStarty -2);
Image4.Left :=( OldStartx -2);
end
else
begin
image4.Top :=( Oldendy -2 );
Image4.Left :=( Oldendx -2) ;
end;
Bmp1.Canvas.CopyRect(Rect(0, 0, Bmp1.Width, Bmp1.Height), Bmp2.Canvas, Rect(OldStartX, OldStartY, OldEndX, OldEndY));
image4.Picture.Bitmap.Assign(bmp1);
image4.Transparent := true;
finally
Bmp1.Free;
end;
|
estou usando este codigo para desenhar o retangulo jogar para a image4..
isso esta funcionando, mas o unico problema eh que em alguns momento ao jogar o desenho para a image4 esta invertendo a transparencia, algumas vezes funciona outras nao funciona..
sabe pq isso acontece??? |
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Abr 25, 2019 9:13 pm Assunto: |
|
|
sabe pq isso acontece???
sim sei pq isso ocorre e tb sei como corrigir.
isso ocorre pq voce não definiu a cor da transparencia e apenas que a imagem possui transfarencia.
exemplo:
image4.Transparent := true; // define que a imagem é transparente
contudo esta transparecia é dada pelo ponto (x,y) da propria imagem, que se não me falha a memoria é (0,altura da imagem) ou seja se a imagem é do tamanho 200,100 logo a cor da transparencia por default será o que estar no pixel (x=0,y=100)
para contornar isso voce pode tb definir a cor da transparencia com o atributo image4.TransparentColor
desta forma o codigo deveria ser:
image4.Transparent := true; // define que a imagem é transparente
image4.TransparentColo:=clred; // define que a cor vermelha é a cor transparente
assim sendo seu codigo deveria ficar assim:
| Código: | if sb2.Down = true then
begin
IsDown := false;
image2.Picture.Bitmap.canvas.Brush.Style:= bsClear;
image2.Picture.Bitmap.Canvas.Pen.Style := psDot;
Image2.Picture.Bitmap.Canvas.Pen.Mode := pmMask;
Image2.Picture.Bitmap.Canvas.Rectangle(OldStartX, OldStartY,
OldEndX, OldEndY);
if not (Image2.Picture.Bitmap is TBitmap) then
raise Exception.Create('A imagem não é um Bitmap');
Bmp2 := TBitmap(Image2.Picture.Bitmap);
Bmp1 := TBitmap.Create;
try
Bmp1.Width := Abs(OldEndX - OldStartX);
Bmp1.Height := Abs(OldEndY - OldStartY);
image4.width := Abs(OldEndX - OldStartX);
image4.Height := Abs(OldEndY - OldStartY);
if OldStartX < oldendX then
begin
image4.Top :=( OldStarty -2);
Image4.Left :=( OldStartx -2);
end
else
begin
image4.Top :=( Oldendy -2 );
Image4.Left :=( Oldendx -2) ;
end;
Bmp1.Canvas.CopyRect(Rect(0, 0, Bmp1.Width, Bmp1.Height), Bmp2.Canvas, Rect(OldStartX, OldStartY, OldEndX, OldEndY));
image4.Picture.Bitmap.Assign(bmp1);
image4.Transparent := true;
image4.Transparent := cor do fundo;// olha só a solução.
finally
Bmp1.Free;
end; |
_________________ Tudo podemos quando tudo sabemos! |
|
| Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Qui Abr 25, 2019 9:34 pm Assunto: |
|
|
otimo.. o codigo ficou assim
| Código: | Image4.Transparent := true;
image4.Picture.Bitmap.TransparentColor := clWhite; |
obrigado pela ajuda |
|
| Voltar ao Topo |
|
 |
kakarlos Experiente

Registrado: Quinta-Feira, 30 de Setembro de 2010 Mensagens: 420
|
Enviada: Sáb Abr 27, 2019 2:31 pm Assunto: |
|
|
boa tarde.. no nomento de posicionar a image4 na tela estou usando este codigo | Código: |
if OldStartX < OldEndX then
begin
Image4.Top := (OldStartY );
Image4.Left := (OldStartX );
end
else
begin
Image4.Top := (OldEndY );
Image4.Left := (OldEndX);
end;
|
ele esta funcionando desde que o usuario desenhe de cima para baixo.....mas nao eh este meu problema..
oque esta acontecendo eh que tenho um scroolbox na image2. e ai quando o scroolbox esta movido para o final da image4 este codigo acima nao funciona direito.. ele cria a image4 fora de onde seria o certo
pelo oque observei esta posicionando a image4 em reçacao ao scroolbox... e nao em relacao a image2
consegue me ajudar? |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|