Подтвердить что ты не робот

С# поворот растрового изображения на 90 градусов

Я пытаюсь повернуть растровое изображение на 90 градусов, используя следующую функцию. Проблема заключается в том, что он отсекает часть изображения, когда высота и ширина не равны.

Обратите внимание на returnBitmap width = original.height и height = original.width

Может ли кто-нибудь помочь мне решить эту проблему или указать, что я делаю неправильно?

    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;
    }
4b9b3361

Ответ 1

Как насчет 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);
    }
}

Ответ 2

Ошибка при первом вызове TranslateTransform:

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

Это преобразование должно находиться в координатном пространстве returnBitmap, а не b, поэтому это должно быть:

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

или эквивалентно

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

Ваша вторая TranslateTransform правильная, потому что она будет применена до поворота.

Однако вы, вероятно, лучше с более простым методом RotateFlip, как предположил Рубенс Фариас.

Ответ 3

Я наткнулся и с небольшим изменением получил работу. Я нашел несколько других примеров и заметил, что что-то не так, что изменило для меня. Мне пришлось вызвать SetResolution, если бы я не сделал изображение, то получилось неправильное значение. Я также заметил, что высота и ширина были обратными, хотя я думаю, что в любом случае будет какая-то модификация для не квадратного изображения. Я решил, что опубликую это для всех, кто сталкивается с этим, как с той же проблемой.

Вот мой код

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);
    }
}