GDI + Повернутое изображение - PullRequest
1 голос
/ 17 февраля 2011

У меня довольно большое (30 МБ) изображение, из которого я хотел бы вынуть небольшой «кусочек».Срез должен представлять повернутую часть исходного изображения.

Следующие работы, но углы пусты, и кажется, что я беру прямоугольную область исходного изображения, затем поворачиваю ее и рисую нане повернутая поверхность, приводящая к отсутствующим углам.

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

Есть предложения?Спасибо,

public Image SubImage(Image image, int x, int y, int width, int height, float angle)
{
    var bitmap = new Bitmap(width, height);

    using (Graphics graphics = Graphics.FromImage(bitmap))
    {
        graphics.TranslateTransform(bitmap.Width / 2.0f, bitmap.Height / 2.0f);
        graphics.RotateTransform(angle);
        graphics.TranslateTransform(-bitmap.Width / 2.0f, -bitmap.Height / 2.0f);
        graphics.DrawImage(image, new Rectangle(0, 0, width, height), x, y, width, height, GraphicsUnit.Pixel);
    }

    return bitmap;
}

1 Ответ

1 голос
/ 17 февраля 2011

Вы должны протестировать производительность, прежде чем выбрать лучший подход, но есть два варианта:

  1. Как вы предлагаете, сначала поверните изображение, а затем извлеките внутренний прямоугольник.
  2. Извлеките внутренний прямоугольник, который больше требуемой повернутой части, но меньше, чем все изображение. Поверните это новое изображение, а затем извлеките внутреннее изображение из повернутого подизображения.

Вариант 2 в основном позволяет выполнять поворот на изображении меньшего размера, чем на всем изображении.

Как я уже сказал, я бы провел приличное тестирование производительности, чтобы определить, действительно ли стоит перейти с вариантом 2 над вариантом 1.

...