我花了很多时间试着在中心周围正确旋转图像。以下示例中的旋转角度为-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)));
结果图像在实际图像的上方和下方都有空格,但不应该。 我做错了什么?
答案 0 :(得分:0)
您在轮换公式中遗漏了-
其中一个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)));
查看重复的Rotating a square TBitmap on its center
抱歉无法链接复制作为近距离投票,因为它没有任何upvotes或接受,因为它是一个从未投票的新手提问者......甚至没有直到今天
你需要遍历目标像素而不是源代码,否则会出现孔,因为你的代码没有任何循环我只能猜出你循环的图像......
您的图片为白色,旋转后为红色
所以你使用透明度?如果是,并且您的图像使用有损压缩压缩,如 JPG ,则颜色可能会扭曲,导致边缘周围出现这些瑕疵,因为透明颜色在整个透明表面上不再是相同的阴影。要解决此问题,您应该在解压缩后将透明颜色阈值恢复为单色值,或使用非降级图像( BMP 或 PNG 格式)
所以你的问题可能是3个子弹中的任何一个,甚至是组合......
<强> [EDIT1] 强>
如果 TaW 是正确的,您的意思是图像的大小而不是空白工件,那么这是由您的轮播实现引起的。由于旋转图像的角可以从旋转中心向所有方向放大图像的BBOX。因此,为了防止切割图像数据,图像被放大了:
如果您想使用原始图像尺寸,请在图像旋转代码中禁用调整大小(并处理图像边界外的访问)或在旋转后找到 BBOX ,如果您想要某些特定图像,请裁剪图像而不是对象周围的空间。
如果您要旋转相同的对象并想要在对象周围保持恒定边框,则可以通过计算OBB一次来加快过程,而不是仅仅旋转其角落而不是计算 BBOX 每次轮换......