【问题标题】:Width/height scaling for image rotation with non-square pixels具有非方形像素的图像旋转的宽度/高度缩放
【发布时间】:2020-11-15 06:27:49
【问题描述】:

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

这是我必须旋转包含在 png 文件(尺寸为 134 像素 x 134 像素)中的箭头的代码的 sn-p:

<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 度)时,它会变成椭圆形,因为考虑到非方形像素需要进行宽度/高度缩放:

我可以解决旋转的两个小问题

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

目前,我无法解决所有中间角度所需的缩放问题。我尝试了各种带有正弦/余弦的方程来计算必要的宽度/高度比例因子,但似乎没有任何效果。我总是最终将旋转的 png 图像压缩/拉伸成椭圆。例如,在没有应用缩放的 45 度时,我看到:

有没有人知道我应该如何计算必要的宽度/高度比例因子以确保 png 图像在不考虑旋转角度的情况下保持圆形?

【问题讨论】:

    标签: python image user-interface kivy


    【解决方案1】:

    我有预感,解决方案是将宽度缩放(220/202)*abs(sin(angle)),将高度缩放(202/220)*abs(sin(angle))

    angle 是一个保存角度(0 到 360 度)的变量,

    sin() 用于正弦曲线,abs() 用于绝对值。

    编辑:

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

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

    x = 134 * cos(angle)
    
    y = 145.940594 * sin(angle)
    

    【讨论】:

    • 我没想过把圆当作椭圆。让我试一试,看看我得到了什么。
    • 不幸的是,使用椭圆方程的运气并不好。我尝试将宽度和高度定义为width = sqrt((134*cos(angle))^2 + (145.940594*sin(angle))^2)height = sqrt((134*cos(angle+90))^2 + (145.940594*sin(angle+90))^2)(即指向旋转方向(宽度)和旋转+90度(高度)的向量的长度),但它仍然给出了一个45度的椭圆.它完美适用于 90 度。
    • 我不知道您的代码如何绘制风玫瑰,但风玫瑰的箭头将遵循我在回答中描述的 (x, y) 路径。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多