如何旋转,裁剪,缩放,翻转

时间:2018-05-07 13:52:07

标签: vba winapi image-processing image-rotation image-scaling

我开始了一个大型项目,需要使用Access和Excel进行多种形式的图像处理的VBA功能。

第一个是图像的简单旋转。现有答案涉及workaroundsthird-party plugins

如何以编程方式裁剪,重新缩放,翻转或旋转图像?

此项目的解决方法或第三方应用程序不够用。

2 个答案:

答案 0 :(得分:1)

在这种情况下,Windows Image Acquisition API (WIA)是理想的解决方案。它提供了 Microsoft Paint Windows Fax & Scan 以及之前的 Windows Camera&扫描仪向导 ... WIA非常直观。

以下是四种最常见的操作裁剪,翻转,旋转和调整大小(更多信息)我将通过从代码开始来保存您滚动浏览对话框。

这些程序都是相当不言自明的,可以按原样复制/粘贴(无需引用。)这些子程序在Access& amp; Windows 7上的Excel 2016。

旋转

Sub imgRotate(inFile As String, outFile As String, degreesRotate As Long) '90, 180, 270
    Dim Img As Object, IP As Object
    Set Img = CreateObject("WIA.ImageFile") 'create WIA objects
    Set IP = CreateObject("WIA.ImageProcess")
    IP.Filters.Add IP.FilterInfos("RotateFlip").filterid 'setup filter
    IP.Filters(1).Properties("RotationAngle") = degreesRotate
    Img.LoadFile inFile 'load image
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save new image
End Sub

翻转

Sub imgFlip(inFile As String, outFile As String, Optional Horizontal As Boolean = True)
    Dim Img As Object, IP As Object
    Set Img = CreateObject("WIA.ImageFile") 'create WIA objects
    Set IP = CreateObject("WIA.ImageProcess")
    IP.Filters.Add IP.FilterInfos("RotateFlip").filterid 'setup filter
    IP.Filters(1).Properties("FlipHorizontal") = Horizontal
    IP.Filters(1).Properties("FlipVertical") = Not Horizontal
    Img.LoadFile inFile 'load image
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save new image
End Sub

重新大小

Sub imgResize(inFile As String, outFile As String, Optional maxWidth As Long, Optional maxHeight As Long, Optional KeepAspect As Boolean = True)
'if KeepAspect = True then both maxWidth and maxHeight must be specified
    Dim Img As Object, IP As Object
    Set IP = CreateObject("WIA.ImageProcess") 'create WIA objects
    Set Img = CreateObject("WIA.ImageFile")
    Img.LoadFile inFile 'load image
    IP.Filters.Add IP.FilterInfos("Scale").filterid 'setup filter
    If maxWidth <> 0 Then IP.Filters(1).Properties("MaximumWidth") = maxWidth
    If maxHeight <> 0 Then IP.Filters(1).Properties("MaximumHeight") = maxHeight
    IP.Filters(1).Properties("PreserveAspectRatio") = KeepAspect
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save image
End Sub

作物

Sub imgCrop(inFile As String, outFile As String, left As Long, top As Long, right As Long, bottom As Long)
    Dim Img As Object, IP As Object
    Set IP = CreateObject("WIA.ImageProcess") 'create WIA objects
    Set Img = CreateObject("WIA.ImageFile")
    Img.LoadFile inFile 'load image
    IP.Filters.Add IP.FilterInfos("Crop").filterid 'setup filter
    With IP.Filters(1)
        .Properties("Left") = Img.Width \ 4
        .Properties("Top") = Img.Height \ 4
        .Properties("Right") = Img.Width \ 4
        .Properties("Bottom") = Img.Height \ 4
    End With
    Set Img = IP.Apply(Img) 'apply change
    Img.SaveFile outFile 'save image

End Sub

(改编自source

支持的格式

使用 WIA.ImageProcess 对象:

WIA.ImageProcess 对象处理我对图像轮换以及其他感兴趣的进程的初始要求。这是一个总结:

要为ImageProcess获取更多文档,我们可以 &#34;问它&#34; 运行此:

Sub List_WIA_ImageProcess_Filters()
    Dim f As Object, x As Long
    For Each f In CreateObject("WIA.ImageProcess").FilterInfos
        x = x + 1
        Debug.Print "#" &x &": " &f.Name &" = " &f.Description &vbLf
    Next f
End Sub

... 得到这个
实际上它是怎么来的,我只是将它复制并粘贴到这里!)

RotateFlip = Rotates in 90 degree increments and Flips, horizontally or vertically.

RotationAngle  - Set the RotationAngle property to 90, 180, or 270 if you wish
                 to rotate, otherwise 0 [the default]
FlipHorizontal - Set the FlipHorizontal property to True if you wish to flip
                 the image horizontally, otherwise False [the default]
FlipVertical   - Set the FlipVertical property to True if you wish to flip
                 the image vertically, otherwise False [the default]
FrameIndex     - Set the FrameIndex property to the index of a frame if you
                 wish to modify a frame other than the ActiveFrame,
                 otherwise 0 [the default]


Crop = Crops the image by the specified Left, Top, Right, and Bottom margins.

Left       - Set the Left property to the left margin (in pixels)
             if you wish to crop along the left, otherwise 0 [the default]
Top        - Set the Top property to the top margin (in pixels)
             if you wish to crop along the top, otherwise 0 [the default]
Right      - Set the Right property to the right margin (in pixels)
             if you wish to crop along the right, otherwise 0 [the default]
Bottom     - Set the Bottom property to the bottom margin (in pixels)
             if you wish to crop along the bottom, otherwise 0 [the default]
FrameIndex - Set the FrameIndex property to the index of a frame if you
             wish to modify a frame other than the ActiveFrame,
             otherwise 0 [the default]


Scale = Scales image to the specified Maximum Width and Maximum Height preserving
Aspect Ratio if necessary.

MaximumWidth        - Set the MaximumWidth property to the width (in pixels)
                      that you wish to scale the image to.
MaximumHeight       - Set the MaximumHeight property to the height (in pixels)
                      that you wish to scale the image to.
PreserveAspectRatio - Set the PreserveAspectRatio property to True
                      [the default] if you wish to maintain the current aspect
                      ration of the image, otherwise False and the image will
                      be stretched to the MaximumWidth and MaximumHeight
FrameIndex          - Set the FrameIndex property to the index of a frame if
                      you wish to modify a frame other than the ActiveFrame,
                      otherwise 0 [the default]


Stamp = Stamps the specified ImageFile at the specified Left and Top coordinates.

ImageFile  - Set the ImageFile property to the ImageFile object that you wish
             to stamp
Left       - Set the Left property to the offset from the left (in pixels)
             that you wish to stamp the ImageFile at [default is 0]
Top        - Set the Top property to the offset from the top (in pixels) that
             you wish to stamp the ImageFile at [default is 0]
FrameIndex - Set the FrameIndex property to the index of a frame if you wish to
             modify a frame other than the ActiveFrame, otherwise 0
             [the default]


Exif = Adds/Removes the specified Exif Property.

Remove     - Set the Remove property to True if you wish to remove the
             specified Exif property, otherwise False [the default] to add the
             specified exif property
ID         - Set the ID property to the PropertyID you wish to Add or Remove
Type       - Set the Type property to indicate the WiaImagePropertyType of the
             Exif property you wish to Add (ignored for Remove)
Value      - Set the Value property to the Value of the Exif property you wish
             to Add (ignored for Remove)
FrameIndex - Set the FrameIndex property to the index of a frame if you
             wish to modify a frame other than the ActiveFrame,
             otherwise 0 [the default]


#6: Frame = Adds/Removes the specified Frame.

Remove     - Set the Remove property to True if you wish to remove the
             specified FrameIndex, otherwise False [the default] to Insert the
             ImageFile before the specified FrameIndex
ImageFile  - Set the ImageFile property to the ImageFile object whose
             ActiveFrame that you wish to add (ignored for Remove)
FrameIndex - For Remove, set the FrameIndex property to the index of the frame
             you wish to remove, otherwise for add, set the FrameIndex to the
             index of the frame to insert the ImageFile before, otherwise 0
             [the default] to append a frame from the ImageFile specified


#7: ARGB = Updates the image bits with those specified.

ARGBData -   Set the ARGBData property to the Vector of Longs that represent
             the ARGB data for the specified FrameIndex (the width and height
             must match)
FrameIndex - Set the FrameIndex property to the index of the frame whose ARGB
             data you wish to modify, otherwise 0 [the default] to modify the
             ActiveFrame


#8: Convert = Converts the resulting ImageFile to the specified type.

FormatID    - Set the FormatID property to the supported raster image format
              desired, currently you can choose from wiaFormatBMP,
              wiaFormatPNG, wiaFormatGIF, wiaFormatJPEG, or wiaFormatTIFF
Quality     - For a JPEG file, set the Quality property to any value from 1 to
              100 [the default] to specify quality of JPEG compression
Compression - For a TIFF file, set the Compression property to CCITT3, CCITT4,
              RLE or Uncompressed to specify the compression scheme,
              otherwise LZW [the default]

答案 1 :(得分:0)

@ashleedawg。

感谢上面的代码。好久不见'。 我花了 3 年时间才找到这个非常有用的线程。

只是想我会使用 WIA 添加另一个有用的代码片段。

EXIF 数据包含从 1 到 8 的方向值:

  1. = 0 度:正确的方向,无需调整。
  2. = 0 度,镜像:图像已从后向前翻转。
  3. = 180 度:图像上下颠倒。
  4. = 180 度,镜像:图像倒置并从后向前翻转。
  5. = 90 度:图像已从后向前翻转并位于其一侧。
  6. = 90 度,镜像:图像在其一侧。
  7. = 270 度:图像已从后向前翻转并位于其远端。
  8. = 270 度,镜像:图像在其远端。

此代码用于修改方向值(intOrientation) 它假设已经制作了原始图像的副本,然后使用修改后的图像“覆盖”原始图像

outFile 为原图,inFile 为临时拷贝

设置 EXIF 方向值

Sub imgOrientation(inFile As String, outFile As String, intOrientation As Integer)

    Dim img As Object, IP As Object
    Set img = CreateObject("WIA.ImageFile") 'create WIA objects
    Set IP = CreateObject("WIA.ImageProcess")

    With IP
        .filters.Add (.FilterInfos("Exif").FilterID)
        .filters(1).Properties("ID") = 274    'Orientation  
        .filters(1).Properties("Type") = 1003 'UnsignedIntegerImagePropertyType  
        .filters(1).Properties("Value") = intOrientation '1-8 where 1=Normal orientation
        img.LoadFile inFile 'load temp image
        Set img = .Apply(img) 'apply changes
        Kill outFile 'delete original image so it can be overwritten
        img.SaveFile outFile 'save updated image to original path
    End With
End Sub

注意: 使用上述代码不会旋转/翻转图像本身。它需要结合合适的代码来完成,比如你上面的