C# GDI+;旋转子图像

C# GDI+;旋转子图像,c#,gdi+,C#,Gdi+,我有一个相当大(30MB)的图像,我想从中取出一小块。切片需要表示原始图像的旋转部分 下面的工作,但角落是空的,似乎我采取了一个矩形区域的原始图像,然后旋转,并绘制在一个未旋转的表面上,导致丢失的角落 我想要的是原始图像上的旋转选择,然后在未旋转的曲面上绘制。我知道我可以先旋转原始图像来实现这一点,但考虑到其大小,这似乎效率低下 有什么建议吗?谢谢 public Image SubImage(Image image, int x, int y, int width, int height, fl

我有一个相当大(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;
}

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

  • 按照您的建议,首先旋转图像,然后提取内部矩形
  • 提取大于所需旋转部分但小于整个图像的内部矩形。旋转此新图像,然后从旋转的子图像中提取内部图像 选项2基本上允许您在比整个图像更小的图像上执行旋转


    就像我说的,我会做一些不错的性能测试,以确定使用选项2而不是选项1是否真的值得。

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

  • 按照您的建议,首先旋转图像,然后提取内部矩形
  • 提取大于所需旋转部分但小于整个图像的内部矩形。旋转此新图像,然后从旋转的子图像中提取内部图像 选项2基本上允许您在比整个图像更小的图像上执行旋转


    就像我说的,我会做一些不错的性能测试,以确定选择2而不是选择1是否真的值得。

    已经在opiton 2上登陆。还没有测试过性能,但它看起来肯定会更快。已经登陆opiton 2。还没有测试过性能,但它看起来肯定会更快。