Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Zoom tipo lupa (https://www.clubdelphi.com/foros/showthread.php?t=36641)

oregon 19-10-2006 10:32:51

Zoom tipo lupa
 
Saludos,

Este hilo no es para realizar una consulta, sino para aportar algo, aunque no es mio.
Buscando soluciones a algunos de mis problemas de programación de zooms, he encontrado una página donde describe como crear un zoom de tipo lupa.

http://delphi.about.com/od/graphics/l/aa120198.htm

Creo que puede serle de utilidad a alguien, por eso lo he puesto acá. Espero no haberme saltado ninguna de las reglas del foro.

Ciao!

Bicho 19-10-2006 11:04:27

Pues hombre muchísimas gracias por tu aportación! :)

Ahora lo que sería la repera es que cogieras ese link lo pasases a un ejemplo en Delphi y lo pusieras en la sección de trucos. Tú o cualquiera que se anime a hacerlo (sino lo hago yo :D ), no hay problema, no quiero ofender. :cool:

Te apuntas un gran tanto con ello.

Nuevamente muchas gracias.

Un saludos

oregon 19-10-2006 11:12:50

Codigo fuente
 
El tanto ya se lo ha apuntado el propio autor de la explicación.
Al final de la explicación de cómo hacerlo, hay un par de enlaces. Uno de ellos para bajarse el código fuente, y el otro para bajar un ejecutable.
La verdad es que lo he probado y el ejemplo es la repera.
Yo lo voy a usar seguro!

No he abierto el código, pero supongo que si trae comentarios están en inglés. Pero creo que no abrá muchas dudas. Si es así solo teneis que decirlo y las traduzco.

ciao!

seoane 19-10-2006 14:08:15

No veo mucha diferencia con este otro código que publique aquí, y que explica como hacerlo usando hasta 3 métodos diferentes.
[Fin de la auto promoción] :D

oregon 19-10-2006 15:49:57

Opps!
 
Perdona Sease,

me debí de saltar ese ejemplo. Ahora le hecho un vistazo.
La verdad es que para qué buscar fuera del foro lo que se puede encontrar dentro, verdad? ;)

Gracias!

oregon 02-11-2006 14:43:38

Más dudas
 
Saludos de nuevo,

Pues tras pegarme un buen rato con esto, no consigo aplicarlo a mi aplicación. En realidad, no me interesa que se haga un zoom sobre todo el screen , sino sólo sobre la imagen contenda en un Timagen dentro del form principal.

Alguna idea?

Muchas gracias!!

seoane 02-11-2006 15:23:31

1 Archivos Adjunto(s)
No es tan complicado, basta con utilizar el canvas de la imagen en vez de DC de la pantalla. He modificado un poco el ejemplo anterior, aunque quizá en vez de usar StretchBlt quizá seria mejor usar CopyRect, pero se utilizaría de una forma similar.

oregon 02-11-2006 15:26:47

Gracias
 
Gracias seoane,

me descargo el ejemplo y me dedico a probar. Ya te cuento si me fue bien. Muchas gracias!

oregon 02-11-2006 15:57:46

¿Solo BMP?
 
He probado el ejemplo, y le he modificado un par de cosillas para ver si me servía, y me he encontrado con que sólo sirve para imágenes BMP.

He quitado el código de onformcreate, y he incluido una imagen jpeg en el cuadro de la izquierda. El problema es que no se ejecuta bien debido a que no es un bmp. Seguiré con ello aq ver que puedo hacer.

Gracias!!

seoane 02-11-2006 16:14:05

Efectivamente, solo se pueden manipular imágenes bmp dentro de un TImage. Tenemos 2 opciones, convertir la imagen de jpg a bmp en el momento de cargarla en el TImage, operación sencilla y que no supone ningún problema, o volver a usar el DC de la pantalla como al principio pero ahora dentro del evento OnMouseMove y no dentro de un Timer. Yo casi prefiero la primera opción, pero eso depende de como realices la carga de la imagen, si en tiempo de diseño o durante el funcionamiento del programa, en ambos casos la forma de hacerlo es diferente pero igual de sencilla.

oregon 02-11-2006 16:33:21

Cargar imagen en ejecución
 
Gracias Seoane,

Lo que pretendo es que el usuario final introduzca una imagen para trabajar con ella, y que la cambie cuantas veces considere. Por ello, habría que cargar la imagen en tiempo de ejecuación.

Otra cosilla. No se si es problema mío, o que el ejemplo lo hiciste así, pero el zoom sobre el rayado de ejemplo sólo podía verse en el área de zoom cuando hacía click con el ratón y luego lo movía sobre la imagen. ¿no es posible ver el zoom sin necesidad de "clickear", sino simplemente moviendo el ratón por encima de la image?

Gracias!!

seoane 02-11-2006 16:40:02

Cita:

Empezado por oregon
Otra cosilla. No se si es problema mío, o que el ejemplo lo hiciste así, pero el zoom sobre el rayado de ejemplo sólo podía verse en el área de zoom cuando hacía click con el ratón y luego lo movía sobre la imagen. ¿no es posible ver el zoom sin necesidad de "clickear", sino simplemente moviendo el ratón por encima de la image?

:D El titulo del formulario es "Ejemplo de Zoom - Mueve el raton sobre la imagen con el boton pulsado", asi que puede que lo hiciera de forma intencionada ;) .

Para cambiar eso, en el evento OnMouseMove:
Código Delphi [-]
procedure TfrmMain.imgMainMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Seleccion: TRect;
  Bitmap: TBitmap;
begin
  if ssLeft in Shift then // <-- Eliminar esta linea
  begin
    Seleccion.Left:= X - 20;
    Seleccion.Right:= X + 20;
    Seleccion.Top:= Y - 20;
    Seleccion.Bottom:= Y + 20;

    if btnCopiar.Checked then
    begin
      Copiar(imgMain.Canvas.Handle,pbZoom.Canvas.Handle,Seleccion,tbZoom.Position);
    end;

    if btnBorrar.Checked then
    begin
      pbZoom.Canvas.FillRect(pbZoom.Canvas.ClipRect);
      Copiar(imgMain.Canvas.Handle,pbZoom.Canvas.Handle,Seleccion,tbZoom.Position);
    end;

    if btnBuffer.Checked then
    begin
      Bitmap:= TBitmap.Create;
      try
        Bitmap.Canvas.Brush.Color:= pbZoom.Canvas.Brush.Color;
        Bitmap.Width:= pbZoom.Width;
        Bitmap.Height:= pbZoom.Height;
        Bitmap.Canvas.FillRect(pbZoom.Canvas.ClipRect);
        Copiar(Canvas.Handle,Bitmap.Canvas.Handle,Seleccion,tbZoom.Position);
        pbZoom.Canvas.Draw(0,0,Bitmap);
      finally
        Bitmap.Free;
      end;
    end;
  end; // <-- Y esta otra
end;

oregon 02-11-2006 17:00:30

:o Perdona. Estoy avergonzado.

Esto de ir acelerado no es nada bueno. Seguro que si me lo hubiese mirado todo con más detenimiento estas cosas no me pasarían.
Procuraré leer más detenidament la próxima vez.

Muchas gracias por tu paciencia!

Ciao!

esublim 15-01-2023 16:35:12

alguien tiene idea de como hacerlo en firemonkey=?

Casimiro Notevi 15-01-2023 19:54:17

Por favor, crea un hilo con tu problema, este es de hace 17 años, y no has dicho nada relevante para que se te pueda ayudar.


La franja horaria es GMT +2. Ahora son las 04:13:34.

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