||
Visual Basic与图像处理(二)
从本节开始,正式开始进入Visual Basic图像处理的内容,在正文中会结合一些实例来讲解Visual Basic处理图像的方法,当然在初始阶段,一切从简单的开始,在处理图像时也仅用Point与PSet相结合完成图像的读和写的两个过程。
1. 读入和保存图像
VB中读入图像可以采用LoadPicture函数直接进行,当然也可以采用读取文件的方法直接读取图像数据,然后将图像数据在PictureBox中进行绘制。为了便于教学,一般都直接采用LoadPicture函数进行图像的读取,LoadPicture函数的原型如下:
LoadPicture ([FileName], [Size], [ColorDepth], [X], [Y]) as TPictureDisp
在我们读入图像时,一般直接使用下面的格式:
Picture1.Picture=LoadPicture (FileName)
当FileName为空时,清空PictureBox中图像。
如果直接使用固定的FileName字符常量时,可读入存储器中固定位置的图像,如果希望以对话框的形式进行图像的选择性读取,可以使用CommonDialog控件实现。
图像保存对打开类似,可以使用写文件的形式进行图像数据的存储,在Visual Basic中提供了配合PictureBox控件专门的文件保存函数SavePicture,其函数原型如下:
SavePicture ( Picture as TPictureDisp, FileName as String)
下面以一个实例示范如何进行图像读取和保存:
窗体中放有1个PictureBox控件用于显示图像,2个CommandButton分别用读取和保存图像,1个CommodDialog控件用于调用对话框。窗体外观如下:
注意设置PictureBox控件的相关属性。本例对应的相关代码如下:
Option Explicit
Private Sub cmdOpenImage_Click()
Dim strFileName As String
CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" '文件过滤,可以打开上述三类图像
CommonDialog1.ShowOpen
If CommonDialog1.FileName <> "" Then
strFileName = CommonDialog1.FileName
PicShowImage.Picture = LoadPicture(strFileName)
End If
End Sub
Private Sub cmdSaveImage_Click()
Dim strFileName As String
CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" '文件过滤,可以打开上述三类图像
CommonDialog1.ShowSave
If CommonDialog1.FileName <> "" Then
strFileName = CommonDialog1.FileName
SavePicture PicShowImage.Picture, strFileName
End If
End Sub
2、PictureBox控件中像素点颜色值存储格式
在PictureBox读入图像以后,像素点以长整型的格式存储在控件之中,利用Point方法可以实现像素点颜色值的读取,具体方法如下:
Picture1.Point (x, y),其中x为横坐标,y为纵坐标。
在使用中常采用以下格式得到对应的值:
Dim PixelValue as Long
PixelValue=Picture1.Point (x, y)
为了便于后续运算,一般要完成颜色数据的分离,即将这个长整型的数转化为对应的Red、Green、Blue三个分量的值。在转化之前,首先看一下颜色值的存储方法,在Visual Basic中颜色点以下面的格式进行存储:
其中第一个字节一般不使用,所以这里只讨论后面三个字节的分离,在数据合成时,上述三个分量分别占1个字节,如果将其理解为256进制就比如容易理解了,相当于十进制中的个位、十位和百位,只是在显示的时候还是以十进制的形式进行显示而已,如果要分离上述数据就比较简单了,只要将十进制转化为对应的256进制就可以了。十进制转化为二进制是除2取余法,转化为256进制也是采用同样的方法,除256取余即可。
下面就是作者在授课是经常采用的一种颜色数据分离方法
Dim r as Integer, g as Integer, b as Integer
r = PixelValue Mod 256
g = (PixelValue 256) Mod 256
b = PixelValue 65536
3.PictureBox颜色点的写入
有了Point方法可以从PictureBox控件中读取颜色点值,对用还需要将某个颜色点值写入到对应的PixtureBox控件之中,这里采用与Point对用的PSet方法,PSet的使用格式如下:
Picture1.PSset (x, y), Color
这里的Color同样对应一个长整型的颜色数值,对上述数据分离对应的时,在数据处理时往往知道的是Red, Green, Blue三个分量的值,需要将这三个分量进行合成,得到长整型的颜色数值,合成方法与前面讲的非常类似,具体方法如下:
PixelValue= r+256*g+256*b
当然在实际使用中还可以直接利用RGB函数进行颜色值的合成,使用方法如下:
PixelValue=RGB(r, g, b)
下面结合一个实例结束这一部分内容,在完成图像读和写以后,本例中完成图像高度和宽度的自动读取,同时利用Point方法读取某个指定位置像素点的值,最后利用PSet方法将图像的左上角一块区域设置为红色。本例的运行结果如下:
对应的代码分别如下:
Option Explicit
Dim ImageHeight As Integer, ImageWidth As Integer
Private Sub cmdOpenImage_Click()
Dim strFileName As String
CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" '文件过滤,可以打开上述三类图像
CommonDialog1.ShowOpen
If CommonDialog1.FileName <> "" Then
strFileName = CommonDialog1.FileName
PicShowImage.Picture = LoadPicture(strFileName)
End If
ImageHeight = PicShowImage.Height
ImageWidth = PicShowImage.Width
Text1 = Str(ImageHeight)
Text2 = Str(ImageWidth)
End Sub
Private Sub cmdPoint_Click()
Dim r As Integer, g As Integer, b As Integer
Dim x As Integer, y As Integer
Dim pixelvalue As Long
x = Val(Text3): y = Val(Text4)
pixelvalue = PicShowImage.Point(x, y)
r = pixelvalue Mod 256
g = (pixelvalue 256) Mod 256
b = pixelvalue 65536
Text5 = Str(r)
Text6 = Str(g)
Text7 = Str(b)
End Sub
Private Sub cmdPSet_Click()
Dim i As Integer, j As Integer
For i = 0 To 20
For j = 0 To 20
PicShowImage.PSet (i, j), RGB(255, 0, 0)
Next j
Next i
End Sub
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-17 19:30
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社