MS Word VBA - InlineShapes.AddPicture 图像方向和高度/宽度不匹配

问题描述 投票:0回答:1

我有一个 VBA 脚本,它采用一个图像文件夹,通过 inlineshapes.addpicture 导入,比较照片的高度/宽度,然后旋转该图像的页面以匹配照片方向。

对于大部分照片,此代码运行良好。

但是,对于某些照片,图像将以纵向导入到文档中,但高度/宽度值会表明它是横向并将页面设置为横向。反过来也可能发生这种情况(即横向变为纵向)

这没有任何意义,因为我可以看到图像在文档中处于纵向方向,但在检查尺寸/位置时,值确实显示为横向。

有谁知道为什么会这样以及我如何根据文档中的显示方式检查高度/宽度的值?

就像Word作为旋转照片导入一样?

vba ms-word
1个回答
0
投票

图片(形状或内嵌形状)的宽度和高度反映了形状的实际大小。如果形状旋转,这些值不会改变。因此,如果宽度 > 高度,您将得到一个横向图像,但是,如果旋转 90 度,它看起来就像是一个纵向图像。

我不确定你现在想做什么:

您想要将图像旋转回 0 度。这样,设置页面方向的逻辑就正确了。

或者您只是想检查图像是否旋转。对于旋转 90 或 270 度的图像,您需要“交换”宽度和高度值:如果高度 > 宽度,则需要横向。

现在(据我所知),微软尚未在 VBA 中公开内联形状的旋转属性。旋转形状(或查询其旋转)的唯一方法是将其转换为形状。如果文档布局或您的以下代码依赖于内联形状,您可以立即将其转换回来。

也许以下的习惯可以帮到你

Function getImageRotation(ish As InlineShape) As Double
    Dim sh As Shape
    Set sh = ish.ConvertToShape
    getImageRotation = sh.rotation
    sh.ConvertToInlineShape
End Function

Sub rotateImage(ish As InlineShape, Optional rotation As Double = 0)
     Dim sh As Shape
     Set sh = ish.ConvertToShape
     sh.rotation = rotation
     sh.ConvertToInlineShape
End Sub

Function isPortrait(ish As InlineShape) As Boolean
    Dim angle As Double
    angle = getImageRotation(ish) Mod 180
    
    If angle > 45 And angle < 135 Then
        isPortrait = ish.Width > ish.Height
    Else
        isPortrait = ish.Width < ish.Height
    End If
End Function

Function isLandscape(ish As InlineShape) As Boolean
    isLandscape = not isPortrait(ish)
End Function
© www.soinside.com 2019 - 2024. All rights reserved.