非方形像素图像旋转的宽度/高度缩放

2024-10-01 13:44:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Kivy框架用Python开发GUI。我的GUI包含一个windrose,其中一个箭头(包含在png图像中)围绕一个圆圈旋转,以指示当前的风向。windrose是圆形的,但是因为我使用的屏幕是非方形像素,所以windrose的实际大小是134像素宽145.940594像素高。需要在垂直方向上应用以说明非正方形像素的系数为220/202=1.089108

WindRosePanel with arrow at 0 degrees

以下是我必须旋转png文件中包含的箭头(尺寸为134像素×134像素)的代码片段:

<WindSpeedPanel>:        # This WindSpeedPanel has dimensions of 262 pixels wide by 220 pixels high
    AnchorLayout:
        pos_hint: {'x': 65/262, 'y': 26/202}
        size_hint: (134/262, 134/202) 
        anchor_x: 'center'
        anchor_y: 'center'
        Image:
            source: 'icons/windRose/arrow.png'
            size_hint: (1, 1)
            keep_ratio: 0
            allow_stretch: 1
            canvas.before:
                PushMatrix
                Rotate:
                    angle: -app.windDir
                    axis: 0, 0, 1
                    origin: self.parent.center
            canvas.after:
                PopMatrix  

我面临的问题是,当图像旋转(例如旋转90度)时,它会变为椭圆形,因为考虑到非方形像素需要进行宽度/高度缩放:

90 degree rotation with no scaling

我可以解决两个简单的情况,其中旋转是

  1. 0度或180度(无需缩放)
  2. 90度或270度(宽度乘以220/202,高度乘以1/(220/202)-即尺寸简单交换)

90/270 degree rotation with scaling

然而,目前我无法解决所有中间角度所需的缩放。我尝试了各种带有正弦/余弦的方程来计算必要的宽度/高度比例因子,但似乎什么都不起作用。我总是以旋转后的png图像被压缩/拉伸成椭圆而告终。例如,在45度且未应用缩放时,我看到:

enter image description here

有人知道我应该如何计算必要的宽度/高度比例因子,以确保png图像无论旋转角度如何都保持圆形吗


Tags: 图像宽度高度png尺寸gui像素圆形
1条回答
网友
1楼 · 发布于 2024-10-01 13:44:29

我有预感,解决办法是按(220/202)*abs(sin(angle))缩放宽度,按(202/220)*abs(sin(angle))缩放高度

角度是保持角度的变量(0到360度)

sin()表示正弦,abs()表示绝对值

编辑:

也许更准确的解决方案是将圆(windrose)视为椭圆

因此,圆上的每个点(x,y)实际上是(假设圆以点(0,0)为中心):

x = 134 * cos(angle)

y = 145.940594 * sin(angle)

相关问题 更多 >