c#图像问题的旋转
我花了相当多的时间试着围绕图像中心正确旋转图像。下例中的旋转角度为-61度。 我用这段代码来计算旋转后的图像大小c#图像问题的旋转,c#,image,graphics,rotation,gdi+,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
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)));
结果图像在实际图像的上方和下方都有空格,但不应该有空格。
我做错了什么
-
其中一个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));
如果您经常旋转同一个对象,并且希望对象周围的边界保持不变,您可以通过计算一次来加快该过程,而不是每次旋转都只旋转其角点,而不是计算BBOX。Ok,因此背景为红色,以显示旋转图像的每一侧都有额外的填充。我还尝试了许多其他解决方案(包括矩阵类),它们都会导致旋转图像周围出现空白。@EugeneBelov您是否尝试过在我的答案中应用所有3个项目符号?若要检查“3”打开你的源图像在油漆和洪水填补空白与红色,如果文物也在那里你得到错误的源图像…并且可以尝试手动修复,但事后不要使用JPG…@TaW为什么你认为他们没有抓住重点?我打赌#3是这样的,至少#1是有效的,因为他使用了错误的公式#2只是一种可能性,因为我们没有看到旋转源代码。。。但我觉得你有另一个可能的原因来解释这种行为/人工制品……尽管标题有误导性,但imo的问题只是关于结果图像的大小。但是,由于OP只计算角点,因此圆形形状周围总是有“白色”空间。事先计算裁剪尺寸并非易事。最好在事件发生后进行裁剪。@TaW添加了edit1以反映这一点(我误解了这个问题,因为我总是看到戒指上下边缘的白色瑕疵,它们也是白色的…)图像周围没有多余的空白。如果你想添加一个裁剪函数,那完全是另一回事。尤其是当源文件是jpeg文件时……如果不分析实际图像,就无法做到这一点。