用VB6.0实现图象“马赛克”
1 引言 |
对一副图像处理后,可以得到各种各样的效果图。比如图像的锐化图、柔化图、浮雕效果图、复古效果图、彩色便笺效果图等,只要打开Photoshop,你不能不为各种各样的效果图惊叹,一副图片竟能产生出如此之多的效果。 |
本文对图像的特效之一——马赛克的实现,介绍了一种简单的算法。 |
2 马赛克原理 |
马赛克效果的原理其实非常简单,可以分为以下三步进行。 |
第一步:对图像进行分块,分块的大小决定马赛克的效果,分块越大,马赛克效果越明显; |
第二步:计算每一块的象素颜色的平均值,作为该块内的所有象素的新值。 |
第三步:利用新的象素值,显示图像得到效果图。 |
3 编程应用 |
下面我们以大小128*128的256级灰度图为例,给出用VB 6.0编写的程序,该程序分别在window98和Windows 2000 环境中实现。 |
I、建立工程:启动VB6.0|新建工程|标准EXE; |
II、控件与菜单:这里我们一共用到2个Microsoft Common Dialogue、1个Progress Bar和2个picture box、2个Label和一个含有二级的菜单。选择视图 | 工具栏 | 标准,在form1上画出picturebox1,picturebox2,lable1和label2;把鼠标移在工具箱上,单击左键,在弹出菜单,选取“部件”,在“控件”上,选中“Microsoft Common Dialog 6.0”和“Microsoft Windows Common Controls 6.0”前面的复选框。再“应用”这时,你已经具备了所有控件。下面我们来建立菜单:选择视图 | 工具栏 | 窗体编辑器,建立一级菜单“文件”,“图像效果”;在“文件”下,建立二级菜单“打开文件”“保存文件”和“退出系统”。在“图像效果”下,建立二级菜单“马赛克” | ![]() |
III、调整控件后锁定,设置控件属性: |
form1.Caption= "图像的马赛克效果示例" |
Picturebox2.ScaleMode= 3 'Pixel; |
Picturebox1. ScaleMode =3 'Pixel |
Lable1.Caption = “原 图”; lable2.caption=“处理后的图片” |
图1:建立好的界面 |
4 程序代码: |
通用声明 |
Option Explicit |
Dim imagepixels(2, 1024, 1024) As Integer '用来存储读入的图像数据 |
Dim picturename, picture_savename As String |
I、打开文件 |
Private Sub open_Click() |
Dim i As Integer, j As Integer |
Dim red As Long, green As Long, blue As Long |
Dim pixel As Long |
' 设置“CancelError”为 True |
CommonDialog1.CancelError = True |
On Error GoTo ErrHandler ' 设置标志 |
CommonDialog1.Flags = cdlOFNHideReadOnly ' 设置过滤器 |
CommonDialog1.filter = "All Files (*.*)|*.*|Text Files" & _ |
"(*.txt)|*.txt|pictures(*.gif)|*.gif|pictures(*.bmp)|*.bmp" ' 指定缺省的过滤器 |
CommonDialog1.FilterIndex = 4 ' 显示“打开”对话框 |
CommonDialog1.ShowOpen ' 显示选定文件的名字 |
picturename = CommonDialog1.FileName |
If picturename = "" Then Exit Sub |
Picture1.Picture = LoadPicture(picturename) |
Picture2.Picture = Picture1.Picture |
Picture1.Refresh |
Picture2.Refresh |
Picture1.AutoSize = True |
x = Picture1.ScaleWidth |
y = Picture1.ScaleHeight |
form1.Visible = False |
For i = 0 To y - 1 |
For j = 0 To x - 1 |
pixel& = form1.Picture1.Point(j, i) |
red = pixel& Mod 256 |
green = ((pixel& And &HFF00) / 256&) Mod 256& |
blue = (pixel& And &HFF0000) / 65536 |
imagepixels(0, j, i) = red '分别存储像素点的GRB值 |
imagepixels(1, j, i) = green |
imagepixels(2, j, i) = blue |
Next |
Next |
form1.Visible = True |
form1.Show |
ErrHandler: |
' 用户按了“取消”按钮 |
Exit Sub |
End Sub |
II、保存文件 |
Private Sub save_Click() |
CommonDialog2.CancelError = True ' 初始化“CancelError”为 True |
On Error GoTo ErrHandler ' 设置标志 |
CommonDialog2.Flags = cdlOFNHideReadOnly ' 设置过滤器 |
CommonDialog2.filter = "All Files (*.*)|*.*|Text Files" & _ |
"(*.txt)|*.txt|pictures(*.gif)|*.gif|pictures(*.bmp)|*.bmp" ' 指定缺省的过滤器 |
CommonDialog2.FilterIndex = 4 ' 显示“打开”对话框 |
CommonDialog2.ShowSave ' 显示选定文件的名字 |
picture_savename = CommonDialog2.FileName |
SavePicture Picture1.Image, picture_savename |
ErrHandler: ' 用户按了“取消”按钮 |
Exit Sub |
End Sub |
III.退出系统 |
Private Sub exit_Click() |
Unload Me |
End Sub |
IV.实现图像马赛克效果 |
Private Sub mmasaike_Click() '对彩色图像进行马赛克效果 |
Dim i As Integer, j As Integer |
Const a = 2 |
Dim dx As Integer, dy As Integer |
Dim red As Long, green As Long, blue As Long |
Dim gray, m, n |
Dim YofImg, UofImg, VofImg, redr, greeng, blueb '记录需削波的象素点的yuv值。 |
Dim f_rgb(10) As Single |
Dim yuv(10) As Single |
If Picture1.Picture = 0 Then |
MsgBox ("please choose an image,firstly") |
Exit Sub |
End If |
ProgressBar1.Visible = True |
For i = 0 To (127 + 1) / a Step a '本例中的实验图像为128*128 |
For j = 0 To (127 + 1) / a Step a '马赛克半径为4的小方块。 |
red = 0 |
'在灰度图中,因为其RGB各分量的值都相等,所以仅取R分量的值就可以作为计算平均亮度的值。 |
For m = 0 To a * a - 1 |
For n = 0 To a * a - 1 |
red = red + imagepixels(0, a * j + m, a * i + n) |
'求出亮度 |
Next |
Next |
red = Int(red / (2 * a) ^ 2) |
For m = 0 To a * a - 1 Step 1 |
For n = 0 To a * a - 1 Step 1 |
Picture1.PSet (a * j + m, a * i + n), RGB(red, red, red) |
Next |
Next |
Next |
Picture1.Refresh |
ProgressBar1.Value = i * 100 / (128 / a) |
DoEvents |
Next |
MsgBox ("马赛克过程完毕!") |
frmmain.ProgressBar1.Visible = False |
End Sub |
运行过程图: |
![]() |
处理前后图的比较: |
![]() |
5 结束语 |
将图像的存储阵作一些小变换,往往可以得到不同的效果图,有兴趣的读者不妨动手试一试,说不定您也能发明出象PHOTOSHOP里的滤镜插件! |