验证码的波形滤镜效果——使用正弦曲线Wave扭曲图片
卓月 2014-04-29 11:59:46 最近在做验证码的生成,看到有很多的验证码使用验证码波形滤镜效果,正弦曲线Wave扭曲图片。代码如下
public sealed class VerifyCode
{
private Random rnd = new Random(unchecked((int)DateTime.Now.Ticks));
属性变量
属性设置
#region 产生波形滤镜效果并画一个边框
// <summary>
// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)
// </summary>
// <param name="srcBmp">图片路径</param>
// <param name="bXDir">如果扭曲则选择为True</param>
// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>
// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
// <returns></returns>
private Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
{
//const double PI = 3.1415926535897932384626433832795;
const double PI2 = 6.283185307179586476925286766559;
Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
// 将位图背景填充为白色
Graphics g = System.Drawing.Graphics.FromImage(destBmp);
g.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height);
double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;
for (int i = 0; i < destBmp.Width; i++)
{
for (int j = 0; j < destBmp.Height; j++)
{
double dx = 0;
dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen;
dx += dPhase;
double dy = Math.Sin(dx);
// 取得当前点的颜色
int nOldX = 0, nOldY = 0;
nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
nOldY = bXDir ? j : j + (int)(dy * dMultValue);
System.Drawing.Color color = srcBmp.GetPixel(i, j);
if (nOldX >= 0 && nOldX < destBmp.Width
&& nOldY >= 0 && nOldY < destBmp.Height)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
}
//渐变效果
//g.FillRectangle(new LinearGradientBrush(new Point(0, 0), new Point(destBmp.Width, destBmp.Height), Color.FromArgb(0, 0, 0, 0), Color.FromArgb(255, 255, 255, 255)), 0, 0, destBmp.Width, destBmp.Height);
//画边框
g.DrawRectangle(new Pen(Color.Gainsboro, 0), 0, 0, destBmp.Width - 1, destBmp.Height - 1);
g.Dispose();
return destBmp;
}
还有一些人使用的公式与本代码不同,我想问一下,使用正弦曲线Wave扭曲图像的原理和公式是怎样的。本人菜鸟一个,希望大神们帮忙解答。不胜感激!