una rotar picture objeto linea inclinar imagen girar figura como c# bitmap

picture - C#rotar mapa de bits 90 grados



inclinar imagen c# (3)

Estoy tratando de rotar un mapa de bits 90 grados usando la siguiente función. El problema con esto es que corta parte de la imagen cuando la altura y el ancho no son iguales.

Observe el ancho de returnBitmap = original.height y su altura = original.width

¿Puede alguien ayudarme a resolver este problema o señalar qué estoy haciendo mal?

private Bitmap rotateImage90(Bitmap b) { Bitmap returnBitmap = new Bitmap(b.Height, b.Width); Graphics g = Graphics.FromImage(returnBitmap); g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2); g.RotateTransform(90); g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2); g.DrawImage(b, new Point(0, 0)); return returnBitmap; }


¿Qué pasa con this ?

private void RotateAndSaveImage(String input, String output) { //create an object that we can use to examine an image file using (Image img = Image.FromFile(input)) { //rotate the picture by 90 degrees and re-save the picture as a Jpeg img.RotateFlip(RotateFlipType.Rotate90FlipNone); img.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg); } }


El error está en su primera llamada a TranslateTransform :

g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);

Esta transformación debe estar en el espacio de coordenadas de returnBitmap lugar de b , por lo que debería ser:

g.TranslateTransform((float)b.Height / 2, (float)b.Width / 2);

o equivalente

g.TranslateTransform((float)returnBitmap.Width / 2, (float)returnBitmap.Height / 2);

Su segundo TranslateTransform es correcto, porque se aplicará antes de la rotación.

Sin embargo, probablemente estés mejor con el método RotateFlip más RotateFlip , como sugirió Rubens Farias.


Me encontré y con una pequeña modificación conseguí que funcionara. Encontré algunos otros ejemplos y noté que faltaba algo que hizo la diferencia para mí. Tuve que llamar a SetResolution, si no, la imagen terminó con el tamaño incorrecto. También noté que la Altura y el Ancho estaban al revés, aunque creo que de todos modos habría alguna modificación para una imagen no cuadrada. Pensé que publicaría esto para cualquiera que se encuentre con esto como lo hice con el mismo problema.

Aqui esta mi codigo

private static void RotateAndSaveImage(string input, string output, int angle) { //Open the source image and create the bitmap for the rotatated image using (Bitmap sourceImage = new Bitmap(input)) using (Bitmap rotateImage = new Bitmap(sourceImage.Width, sourceImage.Height)) { //Set the resolution for the rotation image rotateImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution); //Create a graphics object using (Graphics gdi = Graphics.FromImage(rotateImage)) { //Rotate the image gdi.TranslateTransform((float)sourceImage.Width / 2, (float)sourceImage.Height / 2); gdi.RotateTransform(angle); gdi.TranslateTransform(-(float)sourceImage.Width / 2, -(float)sourceImage.Height / 2); gdi.DrawImage(sourceImage, new System.Drawing.Point(0, 0)); } //Save to a file rotateImage.Save(output); } }