📄 m78.htm
字号:
<html>
<head>
<title>VB教程</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<p align="center"><script src="../../1.js"></script></a>
<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center>
<table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
<tbody>
<tr>
<td bgcolor=#000000 height=9>
<div align=center class=H1> <font color="#FFFFFF">用VB设计图像滤镜</font> </font> </font></div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=76>
<p align="left"> <br>
</font></p>
<p> PhotoShop图像处理软件最引人之处莫过于它的滤镜功能,如果你掌握了一些VB的知识,那么你也能够设计出图像处理大师级的滤镜效果。</span></font></p>
<p> 首先你必须了解VB中图像处理的一些基本知识。在VB中有两个操作像素的基本方法:PSet和Point。PSet生成像素;Point则读取像素值。并且显示器上所能显示的所有颜色都可以用RGB值来表示,VB中提供了RGB()函数,有三个变量RGB(Red,Green,Blue),如RGB(255,0,0)表示红色,RGB(255,255,0)表示黄色等。
VB中没有提供将一个像素点的颜色返回成RGB值的函数,但我们可以用以下方法获得某一点的RGB值:</font></span></p>
<p> Pi& = Picture.Point(X,
Y)</font></span></p>
<p> Red = Pi& Mod 256</font></span></p>
<p> Green = ((pi& And
&HFF00) / 256&) Mod 256&</font></span></p>
<p> Blue = (pi1& And &HFF0000)
/ 65536</font></span></p>
<p> 有了以上知识,再通过一些滤镜算法便可以产生一些很不错的滤镜效果。在此以浮雕、木刻、油画和灯光共四个滤镜效果为例。</font></span></p>
<p> 具体操作步骤如下:</font></span></p>
<p> 新建一个窗体 Form1,在图体上建立一个Picture1图像框,将其AutoSize的值设为
Ture,然后用Picture1的LoadPicture()命令调入一幅图像,再通过各种事件调用过滤过程(这里以Picture1_Click()事件来调用)。</font></span></p>
<p> 以下为具体代码:</font></span></p>
<p> Private Sub Form_Load()</font></span></p>
<p> Form1.AutoRedraw
= True</font></span></p>
<p> Form1.ScaleMode =
3</font></span></p>
<p> Picture1.AutoRedraw
= True</font></span></p>
<p> Picture1.ScaleMode
= 3</font></span></p>
<p> Picture1.Picture
= LoadPicture(图像文件全途径名)</font></span></p>
<p> End Sub</font></span></p>
<p> 浮雕(图一)</font></span></p>
<p> 浮雕的算法是在相邻像素的差值上加上一个常数,使黑暗区域增加一些亮度,我们可以取同一行、同一列或对角线上的相邻像素间的差值加上一个常数。</font></span></p>
<p> Private Sub Picture1_Click()</font></span></p>
<p> Dim pi1&, pi2&</font></span></p>
<p> Dim x, y</font></span></p>
<p> Dim A, B As Integer</font></span></p>
<p> Dim Red, Green, Blue
As Integer</font></span></p>
<p> A = 1</font></span></p>
<p> B = 1</font></span></p>
<p> xx = Picture1.ScaleWidth</font></span></p>
<p> yy = Picture1.ScaleHeight</font></span></p>
<p> For x = 1 To xx -
2</font></span></p>
<p> For y = 1 To yy -
2</font></span></p>
<p> pi1& = Picture1.Point(x,
y)</font></span></p>
<p> pi2& = Picture1.Point(x
+ A, y + B)</font></span></p>
<p> Red = Abs((pi1& Mod
256) - (pi2& Mod 256) + 128)</font></span></p>
<p> Green = Abs((((pi1&
And &HFF00) / 256&) Mod 256&) - (((pi2& And &HFF00) / 256&) Mod 256&)
+ 128)</font></span></p>
<p> Blue = Abs(((pi1&
And &HFF0000) / 65536) - ((pi2& And &HFF0000) / 65536) + 128)</font></span></p>
<p> Picture1.PSet (x,
y), RGB(Red, Green, Blue)</font></span></p>
<p> Next y</font></span></p>
<p> Next x</font></span></p>
<p> Picture1.Refresh</font></span></p>
<p> End Sub</font></span></p>
<p> 油画(图二)</font></span></p>
<p> 油画滤镜的算法是:用当前点四周一定范围内任一点的颜色来代替当前点的颜色。</font></span></p>
<p> Private Sub Picture1_Click()</font></span></p>
<p> Dim pi&</font></span></p>
<p> Dim x, y</font></span></p>
<p> Dim A, B As Integer</font></span></p>
<p> Dim Red, Green, Blue
As Integer</font></span></p>
<p> xx = Picture1.ScaleWidth</font></span></p>
<p> yy = Picture1.ScaleHeight</font></span></p>
<p> For x = 2 To xx - 3</font></span></p>
<p> For y = 2 To yy -
3</font></span></p>
<p> A = Rnd * 3 - 1</font></span></p>
<p> B = Rnd * 3 - 1</font></span></p>
<p> pi = Picture1.Point(x
+ A, y + B)</font></span></p>
<p> Red = (pi& Mod 256)</font></span></p>
<p> Green = (((pi& And
&HFF00) / 256&) Mod 256&)</font></span></p>
<p> Blue = ((pi& And &HFF0000)
/ 65536)</font></span></p>
<p> Picture1.PSet (x,
y), RGB(Red, Green, Blue)</font></span></p>
<p> Next y</font></span></p>
<p> DoEvents</font></span></p>
<p> Next x</font></span></p>
<p> Picture1.Refresh</font></span></p>
<p> End Sub</font></span></p>
<p> 木刻(图三)</font></span></p>
<p> 这个滤镜的算法相对简单一点。只需判断当前点是浅色还是深色(即三颜色元素的平均值是否大于128),浅色用白色RGB(255,255,255)代替;深色用黑色RGB(0,0,0)代替。</font></span></p>
<p> Private Sub Picture1_Click()</font></span></p>
<p> Dim pi&</font></span></p>
<p> Dim x, y</font></span></p>
<p> Dim A, B As Integer</font></span></p>
<p> Dim Red, Green, Blue
As Integer</font></span></p>
<p> A = 1</font></span></p>
<p> B = 1</font></span></p>
<p> xx = Picture1.ScaleWidth</font></span></p>
<p> yy = Picture1.ScaleHeight</font></span></p>
<p> For x = 0 To xx</font></span></p>
<p> For y = 0 To yy</font></span></p>
<p> pi = Picture1.Point(x,
y)</font></span></p>
<p> Red = (pi& Mod 256)</font></span></p>
<p> Green = (((pi& And
&HFF00) / 256&) Mod 256&)</font></span></p>
<p> Blue = ((pi& And &HFF0000)
/ 65536)</font></span></p>
<p> If (Red + Green + Blue)
/ 3 < 128 Then</font></span></p>
<p> Picture1.PSet (x, y),
RGB(0, 0, 0)</font></span></p>
<p> Else</font></span></p>
<p> Picture1.PSet (x, y),
RGB(255, 255, 255)</font></span></p>
<p> End If</font></span></p>
<p> Next y</font></span></p>
<p> Next x</font></span></p>
<p> Picture1.Refresh</font></span></p>
<p> End Sub</font></span></p>
<p> 灯光(图四)</font></span></p>
<p> 灯光滤镜的算法很多,这里介绍一种小口径灯光滤镜,具体算法是取一点为光源(这里以30,40为例),从光线末端开始向光源点逐渐增加亮度(向白色接近)。代码为:</font></span></p>
<p> Private Sub Picture1_Click()</font></span></p>
<p> Dim pi1&, pi2&</font></span></p>
<p> Dim x, y</font></span></p>
<p> Dim A, B As Integer</font></span></p>
<p> Dim Red, Green, Blue
As Integer</font></span></p>
<p> A = 30</font></span></p>
<p> B = 40</font></span></p>
<p> xx = Picture1.ScaleWidth</font></span></p>
<p> yy = Picture1.ScaleHeight</font></span></p>
<p> For x = 1 To xx</font></span></p>
<p> For y = 1 To yy</font></span></p>
<p> pi1 = Picture1.Point(x,
y)</font></span></p>
<p> If Sqr((A - x) * (A
- x) + (B - y) * (B - y)) - 40 < 0 Then</font></span></p>
<p> Red = ((pi1& Mod 256)
+ 200 * (1 - (Sqr((A - x) * (A - x) + (B - y) * (B - y)) + 1) / 40))</font></span></p>
<p> Green = ((((pi1& And
&HFF00) / 256&) Mod 256&) + 200 * (1 - (Sqr((A - x) * (A - x) + (B -
y) * (B - y)) + 1) / 40))</font></span></p>
<p> Blue = (((pi1& And
&HFF0000) / 65536) + 200 * (1 - (Sqr((A - x) * (A - x) + (B - y) * (B
- y)) + 1) / 40))</font></span></p>
<p> If Red < 0 Then
Red = 0</font></span></p>
<p> If Red > 255 Then
Red = 255</font></span></p>
<p> If Green < 0 Then
Green = 0</font></span></p>
<p> If Green > 255 Then
Green = 255</font></span></p>
<p> If Blue < 0 Then
Blue = 0</font></span></p>
<p> If Blue > 255 Then
Blue = 255</font></span></p>
<p> Picture1.PSet (x, y),
RGB(Red, Green, Blue)</font></span></p>
<p> End If</font></span></p>
<p> Next y</font></span></p>
<p> Next x</font></span></p>
<p> Picture1.Refresh</font></span></p>
<p> End Sub </font></span></p>
<p></p>
<p align="left">
</table>
</div>
<p align="center"><a href="../../pian/vb.htm">回首页</a>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -