Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Copiar selección de una imagen (https://www.clubdelphi.com/foros/showthread.php?t=55997)

fasthorse 04-05-2008 16:48:26

Copiar selección de una imagen
 
Hola, quiero saber cómo puedo guardar un trozo de un Timage que he seleccionado mediante un Imagen->Canvas->Rectangle(...) para luego hacer operaciones con esa selección.
Se que para copiar se utiliza esto:
Clipboard()->Assign(Imagen->Picture); pero es que yo no quiero copiar la imagen entera, sino solo la selección... y además creo que si por ejemplo quiero cambiarle el color a esa seleccion lo tendria q guardar en otra imagen auxiliar y depues volverla a pegar en la misma posicion de donde estaba.... pero no se como copiar ni guardar ese Rectangle...

Saludos.

Lord Delfos 05-05-2008 20:24:41

Hola, FastHorse.

Fijate en este código

Código Delphi [-]
var o,d:trect;
    c:TBitmap;
begin
  c:=TBitmap.Create;
  c.Height:=100;
  c.Width:=100;
  d.Left:=0;
  d.Top:=0;
  d.Right:=100;
  d.Bottom:=100;
  o:=d;
  c.Canvas.CopyRect(d,img1.Canvas,o);
  c.Canvas.Ellipse(1,1,10,10);
  img1.Canvas.CopyRect(o,c.Canvas,d);
end;

Acá tenemos la imagen original img1. El rectángulo que copiamos es (0,0,100,100), este valor lo tendrías que tener guardado por ahí y corresponde con la selección hecha.

Copiamos al canvas del bitmap auxiliar y hacemos alguna cosa (como escribir una elipse) y después volvemos a dibujar con CopyRect en la imagen de pantalla.

Espero te sirva.

Saludongos.

fasthorse 06-05-2008 19:25:49

ok, ya entiendo, pero con el primer COpyRect que se hace:
c.Canvas.CopyRect(d,img1.Canvas,o); copias la imagen entera en la auxiliar y después copias la eclipse con c.Canvas.Ellipse(1,1,10,10); pero y si solo quiero modificar la elipse??? copiaría solo la elipse en la imagen auxiliar y después la copiaria en imagen de la misma manera asi no? : img1.Canvas.CopyRect(o,c.Canvas,d);.
Es que creo q no lo entiendo bien, porque quien es d???

Saludos.

Lord Delfos 06-05-2008 21:12:58

A ver, a ver.

Con el primer CopyRect lo que hago es copiar un pedazo de la imagen original (img1) a un TBitMap auxiliar (c). Es decir, que copiaría la parte que "fue seleccionada". En este caso yo puse 100x100 por comodidad, pero sería los valores de un TRect que vos tendrías guardado de cuando se seleccionó en la imagen.

Lo de dibujar una elipse es sólo un ejemplo de que nosotros trabajábamos sobre esa selección antes de volver a "pegarla" en la imagen original. Nada más.

¿Quién es d? Bueno, d y o son las coordenadas de destino y de origen de lo que se va a copiar. Nótese que en la segunda llamada se usa el origen como destino, y el destino como origen, justamente porque volvemos a copiar todo al mismo lugar de donde venía...

Cita:

[...] cómo puedo guardar un trozo de un Timage que he seleccionado mediante un Imagen->Canvas->Rectangle(...) para luego hacer operaciones con esa selección.
Se que para copiar se utiliza esto:
Clipboard()->Assign(Imagen->Picture); pero es que yo no quiero copiar la imagen entera, sino solo la selección
Código Delphi [-]
c.Canvas.CopyRect(d,img1.Canvas,o);
Siendo img la imagen original y o el rectángulo de la selección.

Cita:

[...] y además creo que si por ejemplo quiero cambiarle el color a esa seleccion lo tendria q guardar en otra imagen auxiliar y depues volverla a pegar en la misma posicion de donde estaba

Código Delphi [-]
c.Canvas.Ellipse(1,1,10,10); //Toco alguna cosa de la imagen como, digamos, dibuajrle algo.
img1.Canvas.CopyRect(o,c.Canvas,d);//Vuelvo a poner en su lugar la imagen toqueteada.

¿Estamos más claros ahora? Cualquier cosa, preguntá de nuevo.

Saludetes.

fasthorse 08-05-2008 15:20:05

Ah vale, vale, ya entiendo, es que pensé que la eclipse era como mi Rectangle...
Pues muchas gracias, me pongo manos a la obra con ello.

Saludos.

fasthorse 17-05-2008 19:36:05

Hola, hay una cosa que no me va, y es que no se como sacar de aquí las coordenadas de destino...

Imagen->Canvas->MoveTo(origen.x, origen.y);
Imagen->Canvas->MoveTo(origen.x, origen.y);
Imagen->Canvas->Rectangle(origen.x, origen.y, X,Y);
Imagen->Canvas->CopyRect(destino, Imagen->Canvas, destino);

Gracias.

Lord Delfos 19-05-2008 16:17:20

Hmm... A ver. No sé si entiendo bien lo que decís.

Las coordenadas de destino en la imagen temporal que uno va a usar para dibujar, son (0,0,alto,ancho), donde alto y ancho son los de la selección.

Las coordenadas de destino en la imagen original son las mismas que el origen en la imagen original. Después de todo queremos poner exactamente lo que estaba antes (pero modificado) en el mismo lugar que estaba antes.

De ahí que se use el mismo TRect para el origen y el destino. ¿No?


La franja horaria es GMT +2. Ahora son las 00:04:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi