miércoles, 23 de octubre de 2013

Como Girar Una Imagen de Picturebox(cualquier angulo y cualquier direccion) VB.NET -- C#

hola buen dia, por acumulacion de trabajo no me ha sido posible publicar nada, pero ahorita hay oportunidad y les traigo como dice el titulo una clase que nos permite girar una imagen contenida en un picturebox, lo que se necesita para las pruebas de esta clase es lo que se muestra en la siguiente imagen :
Incluir en un formulario Windows los siguientes Controles:

1.- 4 GropuBox (Imagen,Acciones,Propiedades,Direccion de Giro).
2.- 3 Botones (Cargar Imagen, Girar Imagen, Guardar Imagen).
3.- 1 Picturebox
4.- 1 Label (Grados).
 5.- 1 Textbox(Grados).
 6.- 2 RadioButtons(Derecha e Izquierda).

A continuacion Pego el codigo de la clase encargada de girar la Imagen.

 Codigo VB.NET
Private Function girarImagen(ByVal imgOriginal As Image, ByVal grados As Decimal) As Image
        Try
            If rdbDerecha.Checked Then
                grados = -grados
            End If

            'Asignamos imagen original

            Dim bmp As New Bitmap(imgOriginal)

            'Serie de Puntos para conocer las esquinas de la imagen

            Dim lrg As Single = bmp.Width
            Dim alt As Single = bmp.Height
            Dim esq As Point() = {New Point(0, 0), New Point(lrg, 0), New Point(0, alt), New Point(lrg, alt)}

            ' Establece centro del Rectangulo

            Dim cx As Single = lrg / 2
            Dim cy As Single = alt / 2
            Dim i As Long

            For i = 0 To 3
                esq(i).X -= cx
                esq(i).Y -= cy
            Next i

            Dim PI As Decimal = 3.1416

            ' Rotacion.

            Dim angtheta As Single = Single.Parse(grados) * PI / 180.0
            Dim sintheta As Single = Math.Sin(angtheta)
            Dim costheta As Single = Math.Cos(angtheta)
            Dim X As Single
            Dim Y As Single

            For i = 0 To 3
                X = esq(i).X
                Y = esq(i).Y
                esq(i).X = X * costheta + Y * sintheta
                esq(i).Y = -X * sintheta + Y * costheta
            Next i

            ' Translacion X >= 0 and Y >=0 para todas las esquinas.

            Dim xmin As Single = esq(0).X
            Dim ymin As Single = esq(0).Y
            For i = 1 To 3
                If xmin > esq(i).X Then xmin = esq(i).X
                If ymin > esq(i).Y Then ymin = esq(i).Y
            Next i
            For i = 0 To 3
                esq(i).X -= xmin
                esq(i).Y -= ymin
            Next i

            ' Crear bitmap de salida y objetco graphics.

            Dim bmpSalida As New Bitmap(CInt(-2 * xmin), CInt(-2 * ymin))
            Dim grSalida As Graphics = Graphics.FromImage(bmpSalida)

            'Preservar Ultima Esquina
            ReDim Preserve esq(2)

            'Pintamos resultado de imagen Girada.
            grSalida.DrawImage(bmp, esq)

            Return bmpSalida
        Catch ex As Exception
            MsgBox("Error al Girar Imagen, Error:" & ex.Message, MsgBoxStyle.Critical, "Excepcion")
            Return Nothing
        End Try
    End Function
Codigo C#
private Image girarImagen(Image imgOriginal, decimal grados)
{
	try {
		if (rdbDerecha.Checked) {
			grados = -grados;
		}

		//Asignamos imagen original

		Bitmap bmp = new Bitmap(imgOriginal);

		//Serie de Puntos para conocer las esquinas de la imagen

		float lrg = bmp.Width;
		float alt = bmp.Height;
		Point[] esq = {
			new Point(0, 0),
			new Point(lrg, 0),
			new Point(0, alt),
			new Point(lrg, alt)
		};

		// Establece centro del Rectangulo

		float cx = lrg / 2;
		float cy = alt / 2;
		long i = 0;

		for (i = 0; i <= 3; i++) {
			esq(i).X -= cx;
			esq(i).Y -= cy;
		}

		decimal PI = 3.1416;

		// Rotacion.

		float angtheta = float.Parse(grados) * PI / 180.0;
		float sintheta = Math.Sin(angtheta);
		float costheta = Math.Cos(angtheta);
		float X = 0;
		float Y = 0;

		for (i = 0; i <= 3; i++) { 			X = esq(i).X; 			Y = esq(i).Y; 			esq(i).X = X * costheta + Y * sintheta; 			esq(i).Y = -X * sintheta + Y * costheta; 		} 		// Translacion X >= 0 and Y >=0 para todas las esquinas.

		float xmin = esq(0).X;
		float ymin = esq(0).Y;
		for (i = 1; i <= 3; i++) { 			if (xmin > esq(i).X)
				xmin = esq(i).X;
			if (ymin > esq(i).Y)
				ymin = esq(i).Y;
		}
		for (i = 0; i <= 3; i++) {
			esq(i).X -= xmin;
			esq(i).Y -= ymin;
		}

		// Crear bitmap de salida y objetco graphics.

		Bitmap bmpSalida = new Bitmap(Convert.ToInt32(-2 * xmin), Convert.ToInt32(-2 * ymin));
		Graphics grSalida = Graphics.FromImage(bmpSalida);

		//Preservar Ultima Esquina
		Array.Resize(ref esq, 3);

		//Pintamos resultado de imagen Girada.
		grSalida.DrawImage(bmp, esq);

		return bmpSalida;
	} catch (Exception ex) {
		Interaction.MsgBox("Error al Girar Imagen, Error:" + ex.Message, MsgBoxStyle.Critical, "Excepcion");
		return null;
	}
}
Pues ahi esta el codigo para girar la imagen, el ejemplo completo se los dejo en el siguiente link: girarImagen.rar (75 KB) https://mega.co.nz/#!wVpmCDRA!M7jSTF2N-vGMjSGsHBAz81o9vMUg69wG3_vSG31ZuDM Cualquier pregunta o duda por aqui andamos. Saludos...

2 comentarios:

  1. girarImagen.rar ya no está disponible para la descarga en:
    https://mega.co.nz/#!wVpmCDRA!M7jSTF2N-vGMjSGsHBAz81o9vMUg69wG3_vSG31ZuDM

    ResponderEliminar
  2. Excelente tutorial como para hacer un Copy/Paste ya que no explicaste nada, así que no ahí de otra. Otra pagina donde no aprendí anda.

    ResponderEliminar

Hola Deja Tu Comentario !!!