虽然VB可以使用Point函数或API函数GetPiexl获得像素颜色,但速度较慢,同时,CSDN论坛里有几个朋友提出了图像比较的问题,为此,写了以下代码,希望能给有此需要的朋友一些启发:

Option Explicit
'* ************************************************************** *
'*    程序名称:form1.frm
'*    程序功能:快速比较两幅位图
'*    作者:lyserver
'*    联系方式:http://blog.csdn.net/lyserver
'* ************************************************************** *
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Type BITMAP '14 bytes
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
End Type

'为了验证代码,故在窗体加载时自动生成两幅位图
Private Sub Form_Load()
    Dim Pic As PictureBox
   
    Me.ScaleMode = vbPixels
    Set Pic = Me.Controls.Add("VB.PictureBox", "Pic1") '动态加载PictureBox控件
    Pic.ScaleMode = vbPixels
    Pic.BorderStyle = 0
    Pic.Appearance = 0
    Pic.Move 0, 0, 100, 100 '设置PictureBox控件高度和宽度均为100,左下角(100,100)将被忽略
    Pic.AutoRedraw = True
    Pic.Circle (Pic.ScaleWidth / 2, Pic.ScaleWidth / 2), Pic.ScaleWidth / 2 '在控件上画一个正圆
    SavePicture Pic.Image, "c:/旧圆.bmp"  '保存为旧圆
    Pic.Line (0, 0)-(20, 0) '从(0,0)到(20,0)画一条水平直线,终端点(20,0)被忽略
    Pic.Line (10, 10)-(20, 20) '从(10,10)到(20,20)画一第斜线,终端点(20,20)被忽略
    Pic.PSet (30, 30) '在坐标点(30,30)画一个点
    SavePicture Pic.Image, "c:/新圆.bmp" '保存为新圆
    Me.Controls.Remove "Pic1" '删除PictureBox控件
End Sub

'点击按钮后开始进行图像比较
Private Sub Command1_Click()
    Dim OldPic As stdole.IPictureDisp
    Dim NewPic As stdole.IPictureDisp
    Dim OldPicInfo As BITMAP, NewPicInfo As BITMAP
    Dim i As Long, j As Long, k As Long, c As Long

Set OldPic = Me.Controls.Add("VB.PictureBox", "OldPic") '动态增加一个PictureBox控件
    Set NewPic = Me.Controls.Add("VB.PictureBox", "NewPic") '动态增加一个PictureBox控件

Set OldPic = LoadPicture("c:/旧圆.bmp") '打开原始图像文件
    Set NewPic = LoadPicture("c:/新圆.bmp") '打开经过修改后的图像文件
   
    GetObjectAPI OldPic, Len(OldPicInfo), OldPicInfo '获得图像有关信息
    GetObjectAPI NewPic, Len(NewPicInfo), NewPicInfo
   
    If OldPicInfo.bmBitsPixel <> NewPicInfo.bmBitsPixel Or OldPicInfo.bmWidth <> NewPicInfo.bmWidth Or _
        OldPicInfo.bmHeight <> OldPicInfo.bmHeight Then Exit Sub '如果两幅位图大小和颜色深度不一样则取消比较
   
    c = OldPicInfo.bmWidthBytes * OldPicInfo.bmHeight '获得图像数据字节数
    Select Case OldPicInfo.bmBitsPixel '根据图像颜色深度分别处理
        Case 24 '比较24位真彩色,此为VB默认位图格式
            Dim OldData24() As Byte
            Dim NewData24() As Byte
            ReDim OldData24(c - 1) As Byte
            ReDim NewData24(c - 1) As Byte
            GetBitmapBits OldPic, c, OldData24(0)
            GetBitmapBits NewPic, c, NewData24(0)
            For i = 0 To OldPicInfo.bmHeight - 1 '垂直坐标
                For j = 0 To OldPicInfo.bmWidth - 1 '水平坐标
                    k = i * OldPicInfo.bmWidthBytes + j * 3
                    If OldData24(k) <> NewData24(k) Or OldData24(k + 1) <> NewData24(k + 1) Or _
                        OldData24(k + 2) <> NewData24(k + 2) Then
                        Debug.Print "第" & i & "行第" & j & "列像素值不同"
                    End If
                Next
            Next
            Erase OldData24
            Erase NewData24
        Case 32 '比较32位真彩色
            Dim OldData32() As Long
            Dim NewData32() As Long
            ReDim OldData32(c / 4 - 1) As Long
            ReDim NewData32(c / 4 - 1) As Long
            GetBitmapBits OldPic, c, OldData32(0)
            GetBitmapBits NewPic, c, NewData32(0)
            For i = 0 To OldPicInfo.bmHeight - 1 '垂直坐标
                For j = 0 To OldPicInfo.bmWidth - 1 '水平坐标
                    k = i * OldPicInfo.bmWidthBytes + j
                    If OldData32(k) <> NewData32(k) Then
                        Debug.Print "第" & i & "行第" & j & "列像素值不同"
                    End If
                Next
            Next
            Erase OldData32
            Erase NewData32
        Case Else '其它格式暂不处理
    End Select
    Me.Controls.Remove "OldPic"
    Me.Controls.Remove "NewPic"
    Set OldPic = Nothing
    Set NewPic = Nothing
End Sub

摘自:VB如何快带比较两幅位图


更多精彩>>>

VB如何快带比较两幅位图相关推荐

  1. python图合并_Python图像处理实现两幅图像合成一幅图像的方法【测试可用】

    本文实例讲述了Python图像处理实现两幅图像合成一幅图像的方法.分享给大家供大家参考,具体如下: 将两幅图像合成一幅图像,是图像处理中常用的一种操作,python图像处理库PIL中提供了多种种将两幅 ...

  2. matlab中如何区分两幅图的亮度_高中历史教学中利用老地图设计习题的尝试

    相较历史地图侧重"时空观念"的特点,老地图的优势在于"史料实证"与"历史解释".笔者利用两幅同一时期且呈现同一地区却由不同国家绘制出版的老地 ...

  3. 两幅相同大小图像的相似程度的两个评价指标-PSNR和SSIM

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像相似度主要是对两幅图像内容的相似程度进行打分 ...

  4. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  5. 【python图像处理】两幅图像的合成一幅图像(blending two images)

    将两幅图像合成一幅图像,是图像处理中常用的一种操作,python图像处理库PIL中提供了多种种将两幅图像合成一幅图像的接口. 下面我们通过不同的方式,将两图合并成一幅图像. 1.使用Image.ble ...

  6. OpenCv实现两幅图像的拼接

    直接贴上源码 来源:http://www.myexception.cn/image/1498389.html 实验效果 Left.jpg right.jpg ImageMatch.jpg #inclu ...

  7. ITK:两幅图像之差的绝对值

    ITK:两幅图像之差的绝对值 内容提要 C++实现代码 内容提要 计算两个图像中相应像素之差的绝对值. C++实现代码 #include "itkImage.h" #include ...

  8. 比较两幅图像的相似度

    现在以图搜图的功能比较火热,很好奇其原理. 简单的搜索学习得知,实现相似图片搜索的关键技术是"感知哈希算法",作用是对每一张图片按照某种规律生成一个对应的指纹字符串.比较不同图片之 ...

  9. 如何用MaskBlt实现两个位图的合并,从而实现背景透明

    我有两个位图,一个前景图,一个背景图(mask用途). 请问如何用MaskBlt实现两个位图的合并,从而实现背景透明! 核心代码: dcImage.SetBkColor(crColour); dcMa ...

最新文章

  1. SQLI DUMB SERIES-5
  2. 出去旅行带上这些常用日语就够啦!
  3. 问题之JS中传递数值过大或前置有零时
  4. 前端学习(2967):表单验证
  5. Android画板控件,可以写字,签名,画画并生成图片
  6. Java前后端分离第三方登录_网站前后端分离情况下如何实现QQ微信等第三方登陆-Fun言...
  7. 程序员的求生欲有所强?用Python花式哄女友
  8. waf 防火墙限制_Web攻击分类有哪些?防火墙WAF可以抵御哪些攻击?
  9. 单片机原理及应用程序c语言版题库,单片机原理及应用(C语言版)
  10. 微信小程序前四周内容总结
  11. 什么时候用C而不用C++?
  12. C语言 线性链表 节点的创建、添加和删除
  13. sklearn中predict_proba用法(注意和predict的区别)
  14. NVidia 3060/1650S 独显笔记本 HDMI外接屏幕有输出,笔记本屏幕无输出/ubuntu 更改显卡驱动后无法进入图形界面的处理方法 以及禁止内核自动更新
  15. python作排产计划表_生产排程计划表
  16. Flutter 可选参数方法构建
  17. linux 开机自启动 Tomcat
  18. 第一次使用微信开发者工具,登录不显示二维码
  19. oracle12c数据库安装(静默安装
  20. 【VirtualBox】VBox 网络设置|五种网络的区别

热门文章

  1. @前端工程师,节约网站流量用这一招就够了!
  2. 这本 Kindle 排名第一的 Python 3 入门书,火遍了整个编程圈!| 码书
  3. 错乱的 Windows 10
  4. 一文了解 2018 年最值得关注的 12 大框架
  5. 不愿做「奴隶」的程序员们组建了一个王国
  6. 腾讯京东要建“反阿里联盟”?Python 或成 Excel 官方脚本语言;百度华为在一起 | 一周业界事
  7. 学了阿里P8级架构师的7+1+1落地项目,转疯了!
  8. unity android屏幕自适应,Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios...
  9. c语言中区别一般变量,C语言中,为了区别一般的变量,符号常量必须用
  10. python变量和数据类型_Python变量和数据类型简介