C# поворачивают битовый массив 90 градусов

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

Заметьте returnBitmap ширину = original.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;
    }
49
задан curtisk 8 February 2010 в 13:16
поделиться

2 ответа

А как насчет этого :

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);
    }
}
94
ответ дан 7 November 2019 в 11:35
поделиться

Ошибка в первом вызове 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, как предлагал Рубенс Фариас.

9
ответ дан 7 November 2019 в 11:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: