我找了一些例程,但是其中的一些数据类型不是很明白,比如下面的bitmap,没有这个对象数据类型呀 更别说使用它的方法了,GetPixel,这个不是API中的方法吗,怎么会是这个对象的方法呢。Private Function AnalyzePicWithSmallPic(ByVal bmp As Bitmap, ByVal x As Integer) As Bitmap 'bmp要传入的图片,X从什么位置开始(这里指的是宽度) '先获取每个字符的左右范围,再获取这个字符的上下范围 '这里是根据灰度的强弱来判断当前点应该是黑色还是白色 Dim tempBmp As Bitmap Dim width As Integer '得到小图片的宽度 Dim height As Integer '得到小图片的高度 Dim widthX As Integer '得到小图片起始宽的坐标点 Dim heightY As Integer '得到小图片起始高的坐标点 Dim widthEndX As Integer '得到小图片结束宽的坐标点 Dim heightEndY As Integer '得到小图片结束高的坐标点 '记录都没黑点的行 Dim bb As Boolean = True Dim wb As Boolean = True Dim c As Color '得到宽度 For w As Integer = 0 To bmp.Width - 1 wb = True For h As Integer = 0 To bmp.Height - 1 c = bmp.GetPixel(w, h) If c.ToArgb = Color.Black.ToArgb And bb Then '找到第一个黑点 widthX = w bb = False Else If c.ToArgb = Color.Black.ToArgb And Not bb Then '找到第一个黑点后,找到此列中所有像素都为白点的列号 wb = False Exit For End If End If Next If Not bb And wb And widthX < w Then widthEndX = w Exit For End If Next If Not bb And widthEndX = 0 Then widthEndX = bmp.Width - 1 End If width = widthEndX - widthX + 1 '得到宽 '得到高度 bb = True For h As Integer = 0 To bmp.Height - 1 wb = True For w As Integer = 0 To widthEndX '只查找width宽度内的像素点 c = bmp.GetPixel(w, h) If c.ToArgb = Color.Black.ToArgb And bb Then '找到第一个黑点 heightY = h bb = False Else If c.ToArgb = Color.Black.ToArgb And Not bb Then '找到第一个黑点后,找到此列中所有像素都为白点的列号 wb = False Exit For End If End If Next If Not bb And wb And heightY < h Then heightEndY = h Exit For End If Next If Not bb And heightEndY = 0 Then heightEndY = bmp.Height - 1 End If height = heightEndY - heightY + 1 '得到高 Dim Rc As New Rectangle(widthX, heightY, width, height) '定义矩形的框度 tempBmp = bmp.Clone(Rc, Imaging.PixelFormat.Undefined) Return tempBmp '把截到的文本矩形框返回 End Function
建议用 VB 做一个 OCX,在 VBA 中调用,这样就容易处理了。 '单位可以直接设为像素 Picture1.ScaleMode = vbPixels '取得载入图片的大小 Dim pic As IPictureDisp Dim lWidth As Long Dim lHeight As Long Set pic = LoadPicture(...) lWidth = Me.ScaleX(pic.Width, vbHimetric, vbPixels) LHeight = Me.ScaleY(pic.Height, vbHimetric, vbPixels)
1、url=http://download.csdn.net/detail/veron_04/3612323]VB 实现两个文件的比较(不限文件格式)[/url]
2、如果是两个图片文件进行相似度的比较,那么简单的办法可以采用对图片上相对应的点进行颜色偏差对比。颜色偏差的算法是:((R1-R2)^2+(G1-G2)^2+(B1-B2)^2)^0.5>K ,0<=K<=255,大于K,表示两点颜色不相近,小于K表示颜色相近。依次算法对图片进行多点比较。如果全部相近,就表示图片相似。具体参阅:http://topic.csdn.net/u/20070919/16/3f12eaef-01f2-4e71-9804-99848665028e.html
3、使用OpenCV
LoadPicture() 载入图片
PictureBox.PaintPicture() 显示图片
PictureBox.Point() 取得某个坐标的颜色,因为是双色图,所以将颜色直接与 vbBlack 比较就可以区分是该点是黑色还是白色。先对图片进行逐点扫描,求出
x1 —— 最小的黑点x坐标
x2 —— 最大的黑点x坐标
y1 —— 最小的黑点y坐标
y2 —— 最大的黑点y坐标
区域 (x1,y1)-(x2,y2) 就是字符的有效区域
两个图片如果有效区域的大小不等,那么肯定不等;如果大小相等,就对有效区域进行逐点比较。
1 控件中图片的大小是以磅为单位,point()方法操作时,单位是像素吗,是不是要用在确定遍历范围(图的长和宽,要将磅转换为像素,即:磅* 4/3=像素)
2 我用的是VBA,其中没有picturebox控件,只有image,而image没有point方法,有什么替代的方法吗,除了使用API
3 我在VBA中,用监视查看了,加载的图片的一些属性,长宽为10.5磅,而在监视中可以看到image对象有一个picture成员对象,这个picture成员对象有几个属性,其中有两个分别是heigth=318 width=318 您估计这里的318是什么单位
更别说使用它的方法了,GetPixel,这个不是API中的方法吗,怎么会是这个对象的方法呢。Private Function AnalyzePicWithSmallPic(ByVal bmp As Bitmap, ByVal x As Integer) As Bitmap 'bmp要传入的图片,X从什么位置开始(这里指的是宽度)
'先获取每个字符的左右范围,再获取这个字符的上下范围
'这里是根据灰度的强弱来判断当前点应该是黑色还是白色
Dim tempBmp As Bitmap
Dim width As Integer '得到小图片的宽度
Dim height As Integer '得到小图片的高度
Dim widthX As Integer '得到小图片起始宽的坐标点
Dim heightY As Integer '得到小图片起始高的坐标点
Dim widthEndX As Integer '得到小图片结束宽的坐标点
Dim heightEndY As Integer '得到小图片结束高的坐标点 '记录都没黑点的行
Dim bb As Boolean = True
Dim wb As Boolean = True
Dim c As Color '得到宽度
For w As Integer = 0 To bmp.Width - 1
wb = True
For h As Integer = 0 To bmp.Height - 1
c = bmp.GetPixel(w, h)
If c.ToArgb = Color.Black.ToArgb And bb Then '找到第一个黑点
widthX = w
bb = False
Else
If c.ToArgb = Color.Black.ToArgb And Not bb Then '找到第一个黑点后,找到此列中所有像素都为白点的列号
wb = False
Exit For
End If
End If
Next
If Not bb And wb And widthX < w Then
widthEndX = w
Exit For
End If
Next
If Not bb And widthEndX = 0 Then
widthEndX = bmp.Width - 1
End If
width = widthEndX - widthX + 1 '得到宽 '得到高度
bb = True
For h As Integer = 0 To bmp.Height - 1
wb = True
For w As Integer = 0 To widthEndX '只查找width宽度内的像素点
c = bmp.GetPixel(w, h)
If c.ToArgb = Color.Black.ToArgb And bb Then '找到第一个黑点
heightY = h
bb = False
Else
If c.ToArgb = Color.Black.ToArgb And Not bb Then '找到第一个黑点后,找到此列中所有像素都为白点的列号
wb = False
Exit For
End If
End If
Next
If Not bb And wb And heightY < h Then
heightEndY = h
Exit For
End If
Next
If Not bb And heightEndY = 0 Then
heightEndY = bmp.Height - 1
End If
height = heightEndY - heightY + 1 '得到高
Dim Rc As New Rectangle(widthX, heightY, width, height) '定义矩形的框度
tempBmp = bmp.Clone(Rc, Imaging.PixelFormat.Undefined)
Return tempBmp '把截到的文本矩形框返回
End Function
'单位可以直接设为像素
Picture1.ScaleMode = vbPixels
'取得载入图片的大小
Dim pic As IPictureDisp
Dim lWidth As Long
Dim lHeight As Long
Set pic = LoadPicture(...)
lWidth = Me.ScaleX(pic.Width, vbHimetric, vbPixels)
LHeight = Me.ScaleY(pic.Height, vbHimetric, vbPixels)
谢谢这位师傅!! 我懂了,不过我得先去学一下制作OCX,我找到资料了关于制作OCX。
再次谢谢您的指导!!
我想再问您一下,我参考这个方法,在vb6.0里做了一个picturebox.ocx
但是在vba中引用后,不可以给属性赋值,提示属性的设置无效
这是因为社么原因呢?
后来发现赋值要用set
Set picturebox1.Picture = LoadPicture("C:\Documents and Settings\huoju\桌面\9.gif")
用set 可以赋值了,但是picturebox不能正常显示图片,用监视器可以看到确实picture属性已经有值了
这是为什么呢 请教一下您