Redimensionar y dibujar imagen usando Graphics Leido 13.224 veces

 
  Broco
Bueno, esta función sirve para cuando estemos usando Graphics, y queramos dibujar una imagen en alguna zona, para que no sobrepase los límites de la zona, hay que cambiar el tamaño, corriendo el riesgo de poner una imagen Rectangular en una zona cuadrada con la consecuencia de que esta se desforme, esta función lo que hace es redimensionar la imagen proporcionalmente, y dibujarla en el centro de el "System.Drawing.Rectangle" que hayamos indicado.



''' <summary>Dibuja una imagen en la posción indicada sin sobrepasar los límites indicados y sin desformar</summary>
''' <param name="ModoDebug">En este modo se mostrarán los bordes de los rectángulos, para colocar el rectángulo en buena posición</param>
''' <remarks></remarks>
Public Shared Sub DibujarRectanguloConImagenDentro(ByRef Graphics As System.Drawing.Graphics, ByRef Imagen As System.Drawing.Bitmap, ByRef Rectangulo As Rectangle, Optional ByVal ModoDebug As Boolean = False)

Dim AnchoImagen As Integer = Imagen.Width
Dim AltoImagen As Integer = Imagen.Height

Dim NuevoAncho As Integer
Dim Nuevoalto As Integer

'Si el Alto y el Ancho ya son menores que los limites de el rectangulo, establezco los nuevos tamaños con los valores de la imagen, para que no cambie
If AltoImagen < Rectangulo.Height And AnchoImagen < Rectangulo.Width Then
NuevoAncho = Imagen.Width
Nuevoalto = Imagen.Height

Else

Dim DiferenciaAncho As Double = (Rectangulo.Width * 100) / AnchoImagen
Dim DiferenciaAlto As Double = (Rectangulo.Height * 100) / AltoImagen

Dim PorentajeReduccion As Double
If DiferenciaAlto < DiferenciaAncho Then
PorentajeReduccion = DiferenciaAlto
Else
PorentajeReduccion = DiferenciaAncho
End If

NuevoAncho = CType((AnchoImagen / 100) * PorentajeReduccion, Integer)
Nuevoalto = CType((AltoImagen / 100) * PorentajeReduccion, Integer)

End If

Dim PosicionY% = CType(((Rectangulo.Height / 2) - (Nuevoalto / 2)) + Rectangulo.Y, Integer)
Dim PosicionX% = CType(((Rectangulo.Width / 2) - (NuevoAncho / 2)) + Rectangulo.X, Integer)
Graphics.DrawImage(Imagen, PosicionX, PosicionY, CInt(Math.Truncate(NuevoAncho)), CInt(Math.Truncate(Nuevoalto)))
If ModoDebug Then Graphics.DrawRectangle(Pens.Red, Rectangulo)
End Sub

''' <summary>Dibuja una imagen en la posción indicada sin sobrepasar los límites indicados y sin desformar, crea y destruye automaticamente Graphics </summary>
''' <param name="ModoDebug">En este modo se mostrarán los bordes de los rectángulos, para colocar el rectángulo en buena posición</param>
Public Shared Sub DibujarRectanguloConImagenDentro(ByRef ImagenBase As Image, ByRef ImagenDibujar As System.Drawing.Bitmap, ByRef Rectangulo As Rectangle, Optional ByVal ModoDebug As Boolean = False)
Dim Pintor As System.Drawing.Graphics = Graphics.FromImage(ImagenBase)
DibujarRectanguloConImagenDentro(Pintor, ImagenDibujar, Rectangulo, ModoDebug)
Pintor.Dispose()
End Sub

''' <summary>Dibuja una imagen sobre otra, ocupando el mayor area de espacio posible sin llegar a desformar </summary>
Public Shared Sub DibujarRectanguloConImagenDentro(ByRef ImagenBase As Image, ByRef ImagenDibujar As System.Drawing.Bitmap)
Dim Pintor As System.Drawing.Graphics = Graphics.FromImage(ImagenBase)
DibujarRectanguloConImagenDentro(Pintor, ImagenDibujar, New Rectangle(0, 0, ImagenBase.Width, ImagenBase.Height), False)
Pintor.Dispose()
End Sub


Resultado:

 

 





  Jesús
Me gusta, pero te propongo una sobrecarga dónde puedas mandar dos imágenes y que la función ya se genere el graphics y saque el rect de la imagen destino.
 

 


  Broco
Ok Modifico el Articulo, añado:


''' <param name="ModoDebug">En este modo se mostrarán los bordes de los rectángulos, para colocar el rectángulo en buena posición</param>
Public Shared Sub DibujarRectanguloConImagenDentro(ByRef ImagenBase As Image, ByRef ImagenDibujar As System.Drawing.Bitmap, ByRef Rectangulo As Rectangle, Optional ByVal ModoDebug As Boolean = False)
Dim Pintor As System.Drawing.Graphics = Graphics.FromImage(ImagenBase)
DibujarRectanguloConImagenDentro(Pintor, ImagenDibujar, Rectangulo, ModoDebug)
Pintor.Dispose()
End Sub


 

 





    ¿Cuantas columnas?     | 2 columnas | 3 columnas | 4 columnas | 5 columnas | 6 columnas |  
    Escribe la dirección web de la imagen:
  Publica tu respuesta  |  Haz Click en el siguiente cuadro para escribir