Truco: Centrar una Imagen en un contexto gráfico

Puedes crear una subclase de un Picture, Canvas o cualquier otra clase y escribir el código que las permita centrar otras imágenes en sus respectivos contextos gráficos; pero mediante el enfoque de Extensión de Clase podrás reutilizar el mismo código para cualquiera clase que ofrezca un contexto gráfico (o cualquier otra clase futura), de modo que sólo tendrás que pasar como parámetro la instancia de Picture que deseas centrar y re-escalar (en caso necesario).

Seguramente ya sepas que, para crear un Método de Extensión de Clase, debes de añadir un nuevo método a un Módulo; de modo que puedes crear, por ejemplo, un nuevo Módulo con el nombre “ExtensionesGraphics”.

A continuación, añade un nuevo método en dicho módulo con la siguiente signatura:

  • Nombre: CenterPicture
  • Parámetros: Extends g As Graphics, Image As Picture
  • Ámbito: Global

Y el código encargado de situar y escalar la imagen recibida en el área del contexto gráfico:

If Not (image Is Nil) Then
  
  Var Height, Width As Integer
  Var SourceY, SourceX As Integer = 0
  
  If image.Width <= g.Width And image.Height <= g.Height Then
    
    Width = image.Width
    Height = image.Height
    
  Else
        
    If g.Width >= g.Height And image.Width >= image.Height Then
      
      Width = g.Width
      Height = (Image.Height * Width) / image.Width     
      
      If Height > g.Height Then
        
        Height = g.Height
        Width = (image.Width*Height)/image.Height
        
      End If
      
    Elseif g.Width >= g.Height And image.Width <= image.Height Then
      
      Height = g.Height
      Width = (image.Width * Height) / image.Height
      
    Elseif g.Width <= g.Height And image.Width >= image.Height Then
      
      Width = g.Width
      Height = (image.Height * Width) / image.Width
      
    Elseif g.Width <= g.Height And image.Width <= image.Height Then
      
      Height = g.Height
      Width = (image.Width*Height)/image.Height
      
      If Width > g.Width Then
        
        Width = g.Width
        Height = (image.Height*Width)/image.Width
        
      End If
      
    End If
    
  End If
  
  sourcex = (g.Width/2) - (Width/2)
  sourcey = (g.Height/2) - (Height/2)
  
  g.DrawPicture(image,sourcex,sourcey,Width,Height,0,0,image.Width,Image.Height)
  
End If

¡Y eso es todo!

A partir de ahora, podrás llamar a dicho método desde el Manejador de Evento Paint de una instancia Canvas o desde el contexto Graphics de cualquier otro Picture usando:

g.CenterPicture(mImage) // mImage es una instancia válida de un Picture

Por supuesto, puedes añadir otras extensiones de clase que consideres útiles en tu módulo de Graphics.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *