没有合适的资源?快使用搜索试试~ 我知道了~
首页VB DIB图像处理入门
VB DIB图像处理入门
5星 · 超过95%的资源 需积分: 10 37 下载量 42 浏览量
更新于2023-03-16
评论
收藏 455KB PDF 举报
VB DIB图像处理入门实例 像素的获取和输出 图像色阶调整 图像的亮度对比度调整
资源详情
资源评论
资源推荐
上一篇
: VB
图像处理,(二)二次线性插值的应用
|
VB图像处理,(一)像素的获取和输出
一直想自己写一个图像处理的软件。在网络上找各种图
像处理方面的技术文章。
但是找到的往往不是高深的理论,就是用C++等语言写出
来的例程,非常不便。
其实很多时候,我想找的只是一种描述,或者是伪代码,既有利于
理解,也有利于改写成任何语言的版本。
近日,我把自己学到的一些图像处理方面的知识写了一个
ImageCast
的小程序。把自己所掌握的处理技巧作了一个“包
装”,感慨于资料收集的不便和学习VB中的点点滴滴。特将算法
提供给大家以作参考。希望对于一些和我一样在网上寻觅不获的朋
友有所帮主。
要处理一个图像,首先要获得该图像的像素值,而VB本身提供的
PICTURE控件虽然可以打开很多类型的图片,但是它提供的那个
POINT
方法读取像素实在是太慢。而使用
GetPixel
这个
API
的速度
也快不到哪里去,因为
PIONT
方法本身就是对于
GetPixel
的一个
包装。
在VB中要快速获取一幅在PICTURE中打开的图像比较快速的方法
是使用DIB方法,当然还有DDB方法,不过使用DDB方法还需要
考虑不同颜色深度的图像的分别处理,在程序的实现上要相对复
杂,而使用
DIB
方法则不必,并且在处理速度上比
DDB
方法也慢的
有限。
过程一:获得一个在
PICTURE
控件中打开的图像的所有像素。
Public Sub DibGet(ByVal IdSource As Long, XBegin As
Long, ByVal YBegin As Long, ByVal XEnd As Long, ByVal
YEnd As Long)
Dim iBitmap As Long
Dim iDC As Long
Dim I As LongDim
Dim W As Long
Dim H As Long
On Error GoTo ErrLine
Done = False
TimeGet = timeGetTime
页码,1/7VB图像处理,(一)像素的获取和输出 - WallesCai的专栏 - CSDNBlog
2008-2-21http://blog.csdn.net/wallescai/archive/2004/12/31/235270.aspx
TimeGet = timeGetTime
InPutWid = XEnd - XBegin
InPutHei = YEnd - YBegin
W = InPutWid + 1
H = InPutHei + 1
I = (Bits \ 8) - 1
ReDim ColVal(I, InPutWid, InPutHei)
With bi24BitInfo.bmiHeader
.biBitCount = Bits
.biCompression = 0&
.biPlanes = 1
.biSize = Len(bi24BitInfo.bmiHeader)
.biWidth = W
.biHeight = H
End With
iBitmap = GetCurrentObject(IdSource, 7&)
GetDIBits IdSource, iBitmap, 0&, H, ColVal(0, 0, 0),
bi24BitInfo, 0&
DeleteObject iBitmap
Done = True
TimeGet = timeGetTime - TimeGetExit Sub
ErrLine:
MsgBox "
错误号:
" & Err.Number & "
:
" & Err.Description
End Sub
在这个过程中所用到的只是一些参数的设定和API的调用,不涉及
算法。
过程二:图像输出的过程:
Public Sub DIBPut(ByVal IdDestination As Long)
Dim W As Long
Dim H As Long
On Error GoTo ErrLine
Done = False
TimePut = timeGetTime
W = OutPutWid + 1
H = OutPutHei + 1
页码,2/7VB图像处理,(一)像素的获取和输出 - WallesCai的专栏 - CSDNBlog
2008-2-21http://blog.csdn.net/wallescai/archive/2004/12/31/235270.aspx
With bi24BitInfo.bmiHeader
.biWidth = W
.biHeight = H
LineBytes = ((W * Bits + 31) And &HFFFFFFE0) \ 8
.biSizeImage = LineBytes * H
End With
SetDIBitsToDevice IdDestination, 0, 0, W, H, 0, 0, 0, H,
ColOut(0, 0, 0), bi24BitInfo.bmiHeader, 0
Done = True
TimePut = timeGetTime - TimePut
Exit Sub
ErrLine:
MsgBox Err.Description
End Sub
下面解释一下在过程中到的全局变量和数据结构,以及
API
的定
义。
API定义:
删除一个DC
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc
As Long) As Long
删除一个对象
Private Declare Function DeleteObject Lib "gdi32" (ByVal
hObject As Long) As Long
选择当前对象
Private Declare Function GetCurrentObject Lib
"gdi32" (ByVal hdc As Long, ByVal uObjectType As Long)
As Long
获取DIB
Private Declare Function GetDIBits Lib "gdi32" (ByVal
aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan
As Long, ByVal nNumScans As Long, lpBits As Any, lpBI
As BitMapInfo, ByVal wUsage As Long) As Long
获取系统时间
Private Declare Function timeGetTime Lib "winmm.dll" ()
As Long
数据结构定义:
文件信息
头
页码,3/7VB图像处理,(一)像素的获取和输出 - WallesCai的专栏 - CSDNBlog
2008-2-21http://blog.csdn.net/wallescai/archive/2004/12/31/235270.aspx
Private Type BitMapInfoHeader '
文件信息
头
—
—
BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type RGBQuad
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
'rgbReserved As Byte
End Type
Private Type BitMapInfo
bmiHeader As BitMapInfoHeader
bmiColors As RGBQuad
End Type
这三个数据结构都是在
DIB
中不可缺少的。我们不必深究,只是按
照顺序复制粘贴直接使用就是了。
过程中用到的全局变量:
Private Const Bits As Long = 32 '
颜色深度,这里把所有图像
都按照32位来处理
Public Done As Boolean '用于标记一个过程是否结束
Public TimeGet As Long '
用于记录输入过程处理所花
费的时间
Public TimePut As Long '
用于记录输出过程处理所花
费的时间
Dim ColVal() As Byte '
用于存放从
DIB
输入的像素
值
Dim ColOut() As Byte '
用于存放向
DIB
输出的像素
值
页码,4/7VB图像处理,(一)像素的获取和输出 - WallesCai的专栏 - CSDNBlog
2008-2-21http://blog.csdn.net/wallescai/archive/2004/12/31/235270.aspx
值
Dim InPutHei As Long '用于记录输入图像的高度
Dim InPutWid As Long '用于记录输入图像的宽度
Dim bi24BitInfo As BitMapInfo '
定义
BMP
信息
可以看出,我在输入和输出中使用了两个不同的动态数组ColVal()
和ColOut()
这么做是有道理的,因为我们不只是为了输入和输出图像,中间还
要对像素进行处理。
包括图像缩放、色彩调整、锐化、柔化等等处理,使用两个不同的
数组来分别存放数据更有利于程序的实现。
有些性急的朋友说不定已经把程序贴到工程里试用了,可是会发现
根本不能输出图像。
这是因为当你用
DIBGET
获得的图像还在
ColVal()
中呢,需要把
它们放到
ColOut()
这个数组中去,
DIBPUT
这个过程才能起作用。
这里再给出一个用于数组整体移动数据的过程:
Public Sub CopyData(ByVal W As Long, ByVal H As Long)
Dim Length As Long
Dim I As Long
Dim L As Long
I = Bits \ 8
L = I - 1
Length = (W + 1&) * (H + 1&) * I
ReDim ColOut(L, W, H)
CopyMemory ColOut(0, 0, 0), ColVal(0, 0, 0), Length
End sub
API
定义:
Private Declare Sub CopyMemory Lib "kernel32" Alias
"RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal
ByteLen As Long)
这时,我们就可以来试一下效果了:
把你的显示器调到32位色。
将前面的所有
API
和变量定义全部贴到一个新建的模块里
新建一个窗体,加两个
PICTURE
控件:
pictrue1 ,picture2
一个
按钮command1
在pictrue1中加载一个图片
在
d1
中
写
如下代
码
页码,5/7VB图像处理,(一)像素的获取和输出 - WallesCai的专栏 - CSDNBlog
2008-2-21http://blog.csdn.net/wallescai/archive/2004/12/31/235270.aspx
剩余35页未读,继续阅读
wagex
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- ExcelVBA中的Range和Cells用法说明.pdf
- 基于单片机的电梯控制模型设计.doc
- 主成分分析和因子分析.pptx
- 共享笔记服务系统论文.doc
- 基于数据治理体系的数据中台实践分享.pptx
- 变压器的铭牌和额定值.pptx
- 计算机网络课程设计报告--用winsock设计Ping应用程序.doc
- 高电压技术课件:第03章 液体和固体介质的电气特性.pdf
- Oracle商务智能精华介绍.pptx
- 基于单片机的输液滴速控制系统设计文档.doc
- dw考试题 5套.pdf
- 学生档案管理系统详细设计说明书.doc
- 操作系统PPT课件.pptx
- 智慧路边停车管理系统方案.pptx
- 【企业内控系列】企业内部控制之人力资源管理控制(17页).doc
- 温度传感器分类与特点.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2