Почему Graphics.RotateTransform () не может быть применен? - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть следующая функция:

static private Image CropRotate(Image wholeImage, Rectangle cropArea)
{
    Bitmap cropped = new Bitmap(cropArea.Width, cropArea.Height);

    using(Graphics g = Graphics.FromImage(cropped))
    {
        g.DrawImage(wholeImage, new Rectangle(0, 0, cropArea.Width, cropArea.Height), cropArea, GraphicsUnit.Pixel);
        g.RotateTransform(180f);
    }
    return cropped as Image;
}

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

Почему RotateTransform() не применяется?

Ответы [ 2 ]

5 голосов
/ 30 ноября 2010

Вы пытались поставить RotateTransform() перед DrawImage()? Пример на странице msdn показывает преобразование, применяемое перед выполнением любого рисования.

4 голосов
/ 30 ноября 2010

Вызов RotateTransform изменяет текущую матрицу преобразования, что влияет на все последующие операции. Это не преобразовывает уже выведенные операции вообще. Это то же самое для любой из операций, которые изменяют матрицу преобразования (например, ScaleTransform).

Убедитесь, что вы вызываете эти до выполнения операций, которые вы хотите преобразовать - в данном случае, до вызова DrawImage.

Вы можете использовать это, чтобы сделать что-то вроде

  1. Рисование (без поворота или масштабирования)
  2. Поворот (изменяет только матрицу преобразования)
  3. Масштаб (изменяется только матрица преобразования)
  4. Draw (вращается и масштабируется)
  5. ClearTransform (только изменяет матрицу преобразования)
  6. Рисование (без поворота или масштабирования)

первый и последний выходные данные отрисовки не будут преобразованы, но на средний будет влиять как вращение, так и масштаб (в этом порядке).

...