ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

selecionar / recortar em Timage

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Sex Abr 19, 2019 2:54 pm    Assunto: selecionar / recortar em Timage Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Abr 22, 2019 12:57 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Seg Abr 22, 2019 9:44 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Abr 22, 2019 10:07 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Seg Abr 22, 2019 10:23 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Abr 22, 2019 10:28 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Seg Abr 22, 2019 10:37 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Qui Abr 25, 2019 7:27 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Abr 25, 2019 9:13 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Qui Abr 25, 2019 9:34 pm    Assunto: Responder com Citação

otimo.. o codigo ficou assim

Código:
Image4.Transparent := true;
       image4.Picture.Bitmap.TransparentColor := clWhite;



obrigado pela ajuda
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
kakarlos
Experiente
Experiente


Registrado: Quinta-Feira, 30 de Setembro de 2010
Mensagens: 420

MensagemEnviada: Sáb Abr 27, 2019 2:31 pm    Assunto: Responder com Citação

strak2012 escreveu:



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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB