本帖最后由 totola147 于 2012-04-06 02:20:27 编辑

解决方案 »

  1.   

    个人思路:
    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
      

  2.   

    图片小、又是黑白双色,而且字体规范,直接用 VB 内置函数就能处理:
    LoadPicture() 载入图片
    PictureBox.PaintPicture() 显示图片
    PictureBox.Point() 取得某个坐标的颜色,因为是双色图,所以将颜色直接与 vbBlack 比较就可以区分是该点是黑色还是白色。先对图片进行逐点扫描,求出
    x1 —— 最小的黑点x坐标
    x2 —— 最大的黑点x坐标
    y1 —— 最小的黑点y坐标
    y2 —— 最大的黑点y坐标
    区域 (x1,y1)-(x2,y2) 就是字符的有效区域
    两个图片如果有效区域的大小不等,那么肯定不等;如果大小相等,就对有效区域进行逐点比较。
      

  3.   

    请问您一下,关于将位图转换为数值矩阵,
    1 控件中图片的大小是以磅为单位,point()方法操作时,单位是像素吗,是不是要用在确定遍历范围(图的长和宽,要将磅转换为像素,即:磅* 4/3=像素)
    2 我用的是VBA,其中没有picturebox控件,只有image,而image没有point方法,有什么替代的方法吗,除了使用API
    3 我在VBA中,用监视查看了,加载的图片的一些属性,长宽为10.5磅,而在监视中可以看到image对象有一个picture成员对象,这个picture成员对象有几个属性,其中有两个分别是heigth=318 width=318 您估计这里的318是什么单位
      

  4.   

    我找了一些例程,但是其中的一些数据类型不是很明白,比如下面的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
      

  5.   

    建议用 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)
      

  6.   


    谢谢这位师傅!!  我懂了,不过我得先去学一下制作OCX,我找到资料了关于制作OCX。
    再次谢谢您的指导!!  
      

  7.   


    我想再问您一下,我参考这个方法,在vb6.0里做了一个picturebox.ocx
    但是在vba中引用后,不可以给属性赋值,提示属性的设置无效
    这是因为社么原因呢?
    后来发现赋值要用set 
    Set picturebox1.Picture = LoadPicture("C:\Documents and Settings\huoju\桌面\9.gif")
    用set 可以赋值了,但是picturebox不能正常显示图片,用监视器可以看到确实picture属性已经有值了
    这是为什么呢  请教一下您
      

  8.   

    这是我参考做OCX的方法:http://club.excelhome.net/forum.php?mod=viewthread&tid=337291