prrsw的个人博客分享 http://blog.sciencenet.cn/u/prrsw

博文

Visual Basic与图像处理3

已有 3482 次阅读 2012-10-9 19:19 |系统分类:教学心得|关键词:学者| Visual, Basic与图像处理

Visual Basic与图像处理(二)

从本节开始,正式开始进入Visual Basic图像处理的内容,在正文中会结合一些实例来讲解Visual Basic处理图像的方法,当然在初始阶段,一切从简单的开始,在处理图像时也仅用PointPSet相结合完成图像的读和写的两个过程。

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)

下面以一个实例示范如何进行图像读取和保存:

窗体中放有1PictureBox控件用于显示图像,2CommandButton分别用读取和保存图像,1CommodDialog控件用于调用对话框。窗体外观如下:

注意设置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

 

2PictureBox控件中像素点颜色值存储格式

PictureBox读入图像以后,像素点以长整型的格式存储在控件之中,利用Point方法可以实现像素点颜色值的读取,具体方法如下:

Picture1.Point (x, y),其中x为横坐标,y为纵坐标。

在使用中常采用以下格式得到对应的值:

Dim PixelValue as Long

PixelValue=Picture1.Point (x, y)

 

为了便于后续运算,一般要完成颜色数据的分离,即将这个长整型的数转化为对应的RedGreenBlue三个分量的值。在转化之前,首先看一下颜色值的存储方法,在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

 

3PictureBox颜色点的写入

有了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

 



https://m.sciencenet.cn/blog-648901-620817.html

上一篇:Visual Basic与图像处理2
下一篇:Visual Basic与图像处理4

2 吕喆 张学文

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 15:04

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部