|

楼主 |
发表于 2021-1-2 14:17
|
显示全部楼层
三、WIA处理图片
(一)旋转翻转过滤器:旋转图片
- Sub test()
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Bliss.bmp"
- IP.Filters.Add IP.FilterInfos("RotateFlip").FilterID
- IP.Filters(1).Properties("RotationAngle") = 90
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\Bliss90.bmp"
- End Sub
复制代码 (二)裁剪滤镜:裁剪图片
- Sub test()
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Bliss.bmp"
- IP.Filters.Add IP.FilterInfos("Crop").FilterID
- IP.Filters(1).Properties("Left") = Img.Width \ 4
- IP.Filters(1).Properties("Top") = Img.Height \ 4
- IP.Filters(1).Properties("Right") = Img.Width \ 4
- IP.Filters(1).Properties("Bottom") = Img.Height \ 4
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\BlissCrop.bmp"
- End Sub
复制代码 (三)缩放滤镜:缩放图片大小
- Sub test()
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Bliss.bmp"
- IP.Filters.Add IP.FilterInfos("Scale").FilterID
- IP.Filters(1).Properties("MaximumWidth") = 100
- IP.Filters(1).Properties("MaximumHeight") = 100
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\BlissThumb.bmp"
- End Sub
复制代码 (四)邮票过滤器:邮票在另一个图片一个图片
- Sub test()
- Dim Thumb 'As ImageFile
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Set Img = CreateObject("WIA.ImageFile")
- Set Thumb = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Bliss.bmp"
- Thumb.LoadFile "C:\WINDOWS\Web\Wallpaper\BlissThumb.bmp"
- IP.Filters.Add IP.FilterInfos("Stamp").FilterID
- Set IP.Filters(1).Properties("ImageFile") = Thumb
- IP.Filters(1).Properties("Left") = Img.Width - Thumb.Width
- IP.Filters(1).Properties("Top") = Img.Height - Thumb.Height
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\BlissStamp.bmp"
- End Sub
复制代码 (五)EXIF过滤器:写一个新的标题标签图像
- Sub test()
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Dim v 'As Vector
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Set v = CreateObject("WIA.Vector")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Autumn.jpg"
- IP.Filters.Add IP.FilterInfos("Exif").FilterID
- IP.Filters(1).Properties("ID") = 40091
- IP.Filters(1).Properties("Type") = VectorOfBytesImagePropertyType '此处的VectorOfBytesImagePropertyType值应改为:1101
- v.SetFromString "This Title tag written by Windows Image Acquisition Library v2.0"
- IP.Filters(1).Properties("Value") = v
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\AutumnExif.jpg"
- End Sub
复制代码 (六)帧过滤器:创建一个多页TIFF三种图片
- Sub test()
- Dim Img 'As ImageFile
- Dim Page2 'As ImageFile
- Dim Page3 'As ImageFile
- Dim IP 'As ImageProcess
- Dim v 'As Vector
- Set Img = CreateObject("WIA.ImageFile")
- Set Page2 = CreateObject("WIA.ImageFile")
- Set Page3 = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Bliss.bmp"
- Page2.LoadFile "C:\WINDOWS\Web\Wallpaper\Azul.jpg"
- Page3.LoadFile "C:\WINDOWS\Web\Wallpaper\Autumn.jpg"
- IP.Filters.Add IP.FilterInfos("Frame").FilterID
- Set IP.Filters(IP.Filters.Count).Properties("ImageFile") = Page2
- IP.Filters.Add IP.FilterInfos("Frame").FilterID
- Set IP.Filters(IP.Filters.Count).Properties("ImageFile") = Page3
- IP.Filters.Add IP.FilterInfos("Convert").FilterID
- IP.Filters(IP.Filters.Count).Properties("FormatID") = wiaFormatTIFF
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\Bliss.tif"
- Img.ActiveFrame = Img.FrameCount
- Set v = Img.ARGBData
- Set Img = v.ImageFile(Img.Width, Img.Height)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\Autumn.bmp"
- End Sub
复制代码 (七)ARGB过滤器:创建一个修改版本的图片
- Sub test()
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Dim v 'As Vector
- Dim i 'As Long
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Bliss.bmp"
- Set v = Img.ARGBData
- For i = 1 To v.Count Step 21
- v(i) = &HFFFF00FF 'opaque pink (A=255,R=255,G=0,B=255)
- Next
- IP.Filters.Add IP.FilterInfos("ARGB").FilterID
- Set IP.Filters(1).Properties("ARGBData") = v
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\BlissARGB.bmp"
- End Sub
复制代码 (八)从另一个文件转换过滤器:创建一个压缩的JPEG文件
- Sub test()
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "C:\WINDOWS\Web\Wallpaper\Bliss.bmp"
- IP.Filters.Add IP.FilterInfos("Convert").FilterID
- IP.Filters(1).Properties("FormatID").Value = wiaFormatJPEG
- IP.Filters(1).Properties("Quality").Value = 5
- Set Img = IP.Apply(Img)
- Img.SaveFile "C:\WINDOWS\Web\Wallpaper\BlissCompressed.jpg"
- End Sub
复制代码 (九)从另一个文件转换过滤器:转化图片格式
- Sub test()
- Dim Img 'As ImageFile
- Dim IP 'As ImageProcess
- Const wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
- Const wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
- Const wiaFormatGIF = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
- Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
- Const wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
- Set Img = CreateObject("WIA.ImageFile")
- Set IP = CreateObject("WIA.ImageProcess")
- Img.LoadFile "test.bmp"
- IP.Filters.Add IP.FilterInfos("Convert").FilterID
- IP.Filters(1).Properties("FormatID").Value = wiaFormatJPEG
- Set Img = IP.Apply(Img)
- Img.SaveFile "test.jpg"
- End Sub
复制代码 (十)VBA中也有Vector
1.下面的示例演示了如何创建一个Vector对象并初始化为包含ASCII字符串"This is a test"的字节型Vector。
- Sub test()
- Dim v 'As Vector
- Dim i 'As Integer
- Set v = CreateObject("WIA.Vector")
- v.SetFromString "This is a test", True, False
- For i = 1 To v.Count
- MsgBox Chr(v(i))
- Next
- End Sub
复制代码 2.Vector更强大的地方在于可以用来创建图片,只可惜功能太简单了。
- Sub test()
- Dim Img 'As ImageFile
- Dim v 'As Vector
- Set v = CreateObject("WIA.Vector")
- For i = 1 To 100 * 100
- v.Add &HFF0000FF
- Next
- Set Img = v.ImageFile(100, 100)
- Img.SaveFile "Blue." & Img.FileExtension
- End Sub
复制代码 Vector中的一个元素代表一个像素点,示例中的Vector对象有100*100个元素(像素点),每个像素的ARGB值都是FF0000FF(完全不透明的蓝色)。如果你足够强大,你完全可以用Vector来画一幅蒙娜丽莎。
3.VBA可以通过调用WIA.Vector对象画图,使用该对象的Add方法可以把vb中的颜色逐个坐标画到位图中。
下面这段代码,是打印方程X(n+1)=cot(X(n)),x(1)=1迭代20次后的图像(坐标有调整,每个小格并不代表单位1)
- Sub test()
- Debug.Print "计算X(n+1)=cot(X(n)),x(1)=1 迭代20次"
- '沙盘
- Dim v(300, 300)
- '初始值
- Dim F
- F = 1
- '迭代前的初始点
- Dim TX, TY
- For TX = -3 To 3
- For TY = -3 To 3
- v(50 + TX, 150 + TY) = 1
- Next
- Next
- Debug.Print "初始值 " & F
- '迭代公式20次
- Dim Counter
- For Counter = 1 To 20
- F = Cos(F) / Sin(F)
- Debug.Print "第 " & Counter & " 次迭代,值为 " & F
- '沙盘描点
- For TX = -3 To 3
- For TY = -3 To 3
- v(50 + Counter * 10 + TX, 150 + Val(F) * 3 + TY) = 1
- Next
- Next
- Next
- Debug.Print "计算完毕"
- '创建WIA对象
- Set Ve = CreateObject("WIA.Vector")
- '绘制图像
- Dim X, Y, i, J
- For Y = 1 To 300
- For X = 1 To 300
- '描点
- If v(X, Y) = 1 Then
- Ve.Add vbRed
- '横纵轴
- ElseIf X = 50 Or Y = 150 Then
- Ve.Add vbBlue
- '横纵坐标辅助线
- ElseIf X Mod 10 = 0 Or Y Mod 10 = 0 Then
- Ve.Add vbBlack
- '留白
- Else
- Ve.Add vbWhite
- End If
- Next
- Next
- Ve.ImageFile(300, 300).SaveFile ThisWorkbook.Path & "\result.bmp"
- MsgBox "成功生成图片!"
- End Sub
复制代码 (十一)用WIA获取图片分辨率
- Sub test()
- Dim Img 'As ImageFile
- Set Img = CreateObject("WIA.ImageFile")
- Img.LoadFile "test.jpg"
- MsgBox "图片宽度:" & Img.Width & "图片高度:" & Img.Height
- End Sub
复制代码 四、后话
WIA 是 Windows ME 及其以后的操作系统中提供的,Windows 98/2000 均不支持 WIA,因此需要在较新版本的 MSDN Library 中才有 WIA 文档。WIA 1.0 在 MSDN 的文档地址是:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wia/wia/overviews/startpage.asp,或者按目录:MSDN Library -> 图形和多媒体 -> Windows 图像获取 -> WIA 1.0。
|
评分
-
3
查看全部评分
-
|