Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#图像问题的旋转_C#_Image_Graphics_Rotation_Gdi+ - Fatal编程技术网

c#图像问题的旋转

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

我花了相当多的时间试着围绕图像中心正确旋转图像。下例中的旋转角度为-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)));
结果图像在实际图像的上方和下方都有空格,但不应该有空格。 我做错了什么

  • 旋转方程式中缺少
    -

    其中一个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));
    
  • 请参阅副本

    抱歉,不能链接复制为接近投票,因为它没有任何向上投票或接受,因为它是一个从未投过任何票的新手询问者。。。直到今天都没有

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

  • 您的图像为白色,旋转后为红色

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

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

    [Edit1]

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

    如果要使用原始图像大小,请在图像旋转代码中禁用调整大小(并处理图像边界外的访问),或者在旋转后查找BBOX,如果要在对象周围留出特定空间,则裁剪图像


    如果您经常旋转同一个对象,并且希望对象周围的边界保持不变,您可以通过计算一次来加快该过程,而不是每次旋转都只旋转其角点,而不是计算BBOX

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