验证码的波形滤镜效果——使用正弦曲线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扭曲图像的原理和公式是怎样的。本人菜鸟一个,希望大神们帮忙解答。不胜感激!

...全文
173 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2014-05-04
  • 打赏
  • 举报
回复
引用 1 楼 zhuoyue008 的回复:
我已经明白了!
明白了就说说呀
卓月 2014-05-04
  • 打赏
  • 举报
回复
我已经明白了!
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。  我将带领大家一起来学习:Qt麦克风数据探测、FFmpeg解码音频数据、音频波形图、音频播放器。具体内容包括:1.Qt采集麦克风并探测数据,生成动态矩形图。2.FFMpeg解码音频数据,生成PCM数据,并绘制波形图。3.音频播放器实战。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧