c#图像轮换问题

时间:2018-02-10 09:03:16

标签: c# image graphics rotation gdi+

我花了很多时间试着在中心周围正确旋转图像。以下示例中的旋转角度为-61度。 我正在使用此代码计算旋转后的图像大小

        var rad = Math.Sin(angle * Math.PI / 180.0);
        var x0 = width / 2; // rotate around center
        var y0 = height / 2; // rotate around center

        var x = width;
        var y = height;
        var newImgWidth = (float)(x0 + Math.Abs((x - x0) * Math.Cos(rad)) + Math.Abs((y - y0) * Math.Sin(rad)));
        var newImgHeight = (float)(y0 + Math.Abs((x - x0) * Math.Sin(rad)) + Math.Abs((y - y0) * Math.Cos(rad)));

结果图像在实际图像的上方和下方都有空格,但不应该。 我做错了什么?

Rotated image Original image

1 个答案:

答案 0 :(得分:0)

  1. 您在轮换公式中遗漏了-

    其中一个sin therm应该是-sin(),如下所示:

    var newImgWidth  = + (float)(x0 + Math.Abs((x - x0) * Math.Cos(rad)) + Math.Abs((y - y0) * Math.Sin(rad)));
    var newImgHeight = - (float)(y0 + Math.Abs((x - x0) * Math.Sin(rad)) + Math.Abs((y - y0) * Math.Cos(rad)));
    
  2. 查看重复的Rotating a square TBitmap on its center

    抱歉无法链接复制作为近距离投票,因为它没有任何upvotes或接受,因为它是一个从未投票的新手提问者......甚至没有直到今天

    你需要遍历目标像素而不是源代码,否则会出现孔,因为你的代码没有任何循环我只能猜出你循环的图像......

  3. 您的图片为白色,旋转后为红色

    所以你使用透明度?如果是,并且您的图像使用有损压缩压缩,如 JPG ,则颜色可能会扭曲,导致边缘周围出现这些瑕疵,因为透明颜色在整个透明表面上不再是相同的阴影。要解决此问题,您应该在解压缩后将透明颜色阈值恢复为单色值,或使用非降级图像( BMP PNG 格式)

  4. 所以你的问题可能是3个子弹中的任何一个,甚至是组合......

    <强> [EDIT1]

    如果 TaW 是正确的,您的意思是图像的大小而不是空白工件,那么这是由您的轮播实现引起的。由于旋转图像的角可以从旋转中心向所有方向放大图像的BBOX。因此,为了防止切割图像数据,图像被放大了:

    enlarge

    如果您想使用原始图像尺寸,请在图像旋转代码中禁用调整大小(并处理图像边界外的访问)或在旋转后找到 BBOX ,如果您想要某些特定图像,请裁剪图像而不是对象周围的空间。

    如果您要旋转相同的对象并想要在对象周围保持恒定边框,则可以通过计算OBB一次来加快过程,而不是仅仅旋转其角落而不是计算 BBOX 每次轮换......