我有一个 VBA 脚本,它采用一个图像文件夹,通过 inlineshapes.addpicture 导入,比较照片的高度/宽度,然后旋转该图像的页面以匹配照片方向。
对于大部分照片,此代码运行良好。
但是,对于某些照片,图像将以纵向导入到文档中,但高度/宽度值会表明它是横向并将页面设置为横向。反过来也可能发生这种情况(即横向变为纵向)
这没有任何意义,因为我可以看到图像在文档中处于纵向方向,但在检查尺寸/位置时,值确实显示为横向。
有谁知道为什么会这样以及我如何根据文档中的显示方式检查高度/宽度的值?
就像Word作为旋转照片导入一样?
图片(形状或内嵌形状)的宽度和高度反映了形状的实际大小。如果形状旋转,这些值不会改变。因此,如果宽度 > 高度,您将得到一个横向图像,但是,如果旋转 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