GDI +旋转子图像

时间:2011-02-16 23:20:54

标签: c# gdi+

我有一个相当大的(30MB)图像,我想从中取出一小块“切片”。切片需要表示原始图像的旋转部分。

以下工作但角落是空的,看起来我正在拍摄原始图像的矩形区域,然后将其旋转并将其绘制在未旋转的表面上,从而导致缺角。

我想要的是原始图像上的旋转选择,然后在未旋转的表面上绘制。我知道我可以先旋转原始图像来实现这一点,但考虑到它的大小,这似乎效率低下。

有什么建议吗?谢谢,

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 个答案:

答案 0 :(得分:1)

在决定最佳方法之前,您应该对此进行性能测试,但有两个选项

  1. 如您所知,先旋转图像,然后提取内部矩形。
  2. 提取大于所需旋转部分的内部矩形,但小于整个图像。旋转此新图像,然后从旋转的子图像中提取内部图像。
  3. 选项2基本上允许您在比整个图像小的图像上执行旋转。

    就像我说的那样,我会做一些不错的性能测试,以确定选项2是否超过选项1是非常值得的。