【问题标题】:c# Rotation of image issuec#图片旋转问题
【发布时间】:2018-07-21 00:05:53
【问题描述】:

我花了很多时间尝试围绕其中心正确旋转图像。下例中的旋转角度为 -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)));

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

【问题讨论】:

  • 图片周围没有多余的空白。 Just rotated corners。如果要添加裁剪功能,那就完全不同了。尤其是源是 jpeg 文件...
  • 如果不分析实际图像,就无法做到这一点。

标签: c# image graphics rotation gdi+


【解决方案1】:
  1. 你在旋转方程中缺少-

    其中一个罪过应该是-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

    抱歉,无法将重复的投票链接为接近投票,因为它没有任何赞成票或接受,因为它是一个从未投票过的新手提问者......甚至直到今天也没有投票

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

  3. 你的图片是白色的,旋转后是红色的

    所以你使用透明度?如果是,并且您的图像使用 JPG 之类的有损压缩进行压缩,则颜色可能会失真,从而导致边缘周围出现这些伪影,因为透明颜色在整个透明表面上不再是相同的阴影。为了解决这个问题,您应该在解压缩后将透明颜色阈值恢复为单一颜色值或使用非降级图像(BMPPNG 格式)

所以你的问题可能是 3 个项目符号中的任何一个,甚至是组合的......

[编辑1]

如果 TaW 是正确的,并且您的意思是图像的大小而不是空白伪影,那么这是由您的旋转实现引起的。由于旋转图像的角落可以从旋转中心向各个方向放大图像的BBOX。因此,为了防止图像数据被剪切,图像被放大:

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

如果您经常旋转同一个对象并希望对象周围有恒定的边框,您可以通过计算一次 OBB 来加快该过程,而不仅仅是旋转它的角而不是计算每个角的 BBOX旋转...

【讨论】:

  • 好的,所以背景是红色的,只是为了表明旋转图像的每一侧都有额外的填充。我还尝试了许多其他解决方案(包括 Matrix 类),它们都会导致旋转图像周围出现空白。
  • @EugeneBelov 您是否尝试在我的答案中应用所有 3 个项目符号?检查 #3 在油漆中打开您的源图像并用红色填充空白空间,如果工件也在那里,您得到错误的源图像......并且可以尝试手动修复它但不要之后使用 JPG...
  • @TaW 你为什么认为他们没有抓住重点?我敢打赌,#3 是这种情况,至少#1 是有效的,因为他使用了错误的公式......#2 只是一种可能性,因为我们没有看到轮换源代码......但我闻到你的味道这种行为/人工制品有另一个可能的原因......
  • 尽管标题具有误导性,但 imo 的问题仅与生成图像的大小有关。但由于 OP 只计算角落,所以圆形周围总会有“空白”空间。事先没有简单的方法来计算裁剪后的大小。最好在活动结束后进行裁剪。
  • @TaW 添加了 edit1 以反映这一点(我误解了这个问题,因为我总是看到戒指上下边缘的白色伪影也是白色的......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
相关资源
最近更新 更多