将旋转多边形内的内容转移到位图中

3
我将使用C# WinForms。 旋转的多边形绘制在picturebox上。旋转后的多边形的宽度和高度为101,101。现在,我想将旋转后的多边形的内容传输到大小为101,101的新位图中。

enter image description here

我试图使用这段代码绘制矩形的像素
 for (int h = 0; h < pictureBox1.Image.Height; h++)
        {
            for (int w = 0; w < pictureBox1.Image.Width; w++)
            {
                if (IsPointInPolygon(rotatedpolygon, new PointF(w, h)))
                {
                    g.FillRectangle(Brushes.Black, w, h, 1, 1); //paint pixel inside polygon
                }                   
            }
        }

像素按以下方式绘制:enter image description here 现在,我如何知道旋转矩形上的哪个位置对应新位图中的哪个位置。也就是说,如何将旋转矩形的像素坐标转换为新位图。
或者简单地说,是否可以将旋转矩形的行和列映射到新位图中,如下所示?

enter image description here

对不起,如果问题不清楚。


抱歉绘图技巧不好,就将它们视为正方形/矩形。是的,我想复制一个正方形/矩形到一个新的位图上。我不想旋转源图像(因为我认为这样做会使源图像经过插值处理,有质量损失的可能性)。 - cona mx
谢谢你,Peter。我知道旋转图像的选项。但是,我想尝试旋转矩形选项,所以在SO上提出了一个问题,想听听像你这样的专家的意见,是否可能实现。 - cona mx
"我想尝试旋转矩形选项" -- 我觉得你并没有真正理解这意味着什么。在过程结束时,无论怎样操作,源像素都将以不同的方向在目标位图中出现。这就是一种变换类型,不管你喜不喜欢,都需要某种形式的重采样,无论是插值还是简单地减少大小。例如,考虑一个简单的45度旋转情况:在一个正方形沿着45度旋转的一条边上,你大约比垂直或水平定向相同的边多约40%的像素。..." - Peter Duniho
为了将那些在源图像中呈对角线的像素映射到水平或垂直方向,您需要将它们合并。同样,在旋转正方形中的对角线(在源图像中为水平或垂直)将以45度角出现在目标图像中,导致那里有40%更多的像素。由于输出中的像素比输入中的像素多,因此您显然必须在它们之间进行插值以填充缺失的数据。无论您选择什么策略来查找目标图像的像素值,它都将始终涉及一些重采样位图的方法。 - Peter Duniho
明白了。你说得完全正确。我会在5分钟内回复。 - cona mx
显示剩余3条评论
1个回答

1
你所要求的事情并不是字面上可行的。看看你的图表:

enter image description here

在左边,你画了一些自身呈对角线方向的像素。但实际上,在源位图中,像素的方向并不是这样的。源位图将具有水平和垂直方向上的方形像素。
因此,让我们只看一小部分你原始的图像:

enter image description here

考虑这四个像素。根据您的绘图,从水平和垂直方向来看,上下像素与左右像素重叠。更具体地说,如果我们将源位图的实际像素方向与您提议的源像素位置叠加在一起,就会得到以下结果:

enter image description here

如您所见,当您尝试获取最终成为目标图像右上角像素值的像素值时,实际上在请求该组四个像素中的顶部像素。但是,该顶部像素实际上由原始源图像中的两个不同像素组成!
底线是:如果您正在尝试复制的视觉图像将在复制过程中旋转,则源像素和目标像素之间不存在一对一的对应关系。
可以肯定的是,处理这种几何投影的重采样算法确实应用了类似于您提出的概念。但是,它们以数学上合理的方式进行,必要时会合并或插值像素,以将源中的正方形、水平和垂直定位像素映射到目标中的正方形、水平和垂直定位像素。
您唯一能够确切获得您所要求的东西——在实际像素值本身没有任何更改的情况下一一映射像素的方法——就是拥有一个自己旋转的显示器。
现在,所有这些都说完了:我断言您正在尝试解决一个不仅无法解决而且也不值得解决的问题。
现代计算设备的显示分辨率非常高,即使是你身边或口袋里的手机也是如此,因此当你旋转位图图像时发生的重采样对于人类对位图的感知没有影响。只需按照正常方式操作即可,效果很好。

是的,源像素和目标像素之间没有一对一的对应关系,这就是问题所在。我的方法过于复杂,难以实现,我曾经以为可以通过某些几何操作来完成。感谢您的时间和解释。 - cona mx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接