以前写的一个生成彩色验证码的例子。重载了makeCode()函数,即可以生成本地图片,又可生成基于输出流的图片。
package smart.gui.util;
。。。
public class ColoredCodeMaker {
private final static String letterCollection =
"ABEFGHNRTabcdefghjkmnprstuvwxyz23456789";
private String randomStr = "";
private RenderedImage renderedImg = null;
public ColoredCodeMaker(int width, int height, int letterCount) {
init(letterCount);
makeRenderedImage(width, height);
}
public String makeCode(OutputStream os) {
String formatName = "JPEG";
try {
ImageIO.write(this.renderedImg, formatName, os);
}
catch (Exception ex) {
return "";
}
return randomStr;
}
public String makeCode(File outputFileName) {
String formatName = "JPEG";
try {
ImageIO.write(this.renderedImg, formatName, outputFileName);
}
catch (Exception ex) {
return "";
}
return randomStr;
}
private void makeRenderedImage(int width, int height) {
if (width <= 0) {
width = 60;
}
if (height <= 20) {
height = 20;
}
/**
* TYPE_INT_RGB Represents an image with 8-bit RGB color components packed into integer pixels.
* The image has a DirectColorModel without alpha.
*/
BufferedImage bufImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
/**
* 获取图形上下文
*/
Graphics g = bufImage.createGraphics();
/**
* 设置背景色
*/
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
/**
* 画边框
*/
g.setColor(Color.black);
g.drawRect(0,0,width-1,height-1);
/**
* 将认证码显示到图像中
*/
g.setColor(Color.black);
g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
for (int i = 0; i < randomStr.length(); i++) {
g.drawString(randomStr.charAt(i)+"", width/(randomStr.length()+2)*(i+1), height/2 + 10);
}
Random random = new Random();
for (int i = 0; i < width/2; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
g.drawOval(x,y,1,1);
}
g.dispose();
this.renderedImg = bufImage;
}
private void init(int letterCount) {
if (randomStr.length() != letterCount) {
randomStr = "";
for (int i = 0; i < letterCount; i++) {
randomStr +=
letterCollection.charAt( (int) (letterCollection.length() *
Math.random()));
}
}
}
}
测试代码,图片宽150,高40,图片上共8个随机字符,保存在C盘下
ColoredCodeMaker ccm = new ColoredCodeMaker(150,40,8);
ccm.makeCode(new java.io.File("C://aaa.jpeg"));
----------------------------------------------------------------------------------------------------------------------------------------------用VB制作验证码生成器
算法设计
1.窗体设计
启动VB6并新建一个标准EXE工程,布置好控件并设置好名称。
接着将两个图片框的AutoRedraw属性设置成True,txt_inp、cmd_browse的Enabled属性设置为False,txt_inp的Maxlength属性设置成10。然后单击“工程→部件”,勾选“Microsoft CommonDialog Control 6.0”。
2.算法
加密过程是程序的重点。在这里我们运用画线和画点函数来处理图片,在图片框上随机选两个点画直线,同时用随机函数确定它的颜色;再随机点一个点,同样用随机函数确定它的颜色。在这里我们还用随机取字体样式和背景色,不过要注意的是,背景和字体颜色的差别要搞大一些,由于每个RBG分量值越大颜色越深,因此我们用下面两条语句就可以增强颜色的对比度:
pic_las.ForeColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
pic_las.BackColor = RGB(Rnd * 55, Rnd * 55, Rnd * 55)
绘制图像的具体的代码如下:
Sub AddPas()
On Error GoTo Err1
pic_las.Print Space(10 - Len(Result)); Result
Dim x, y, x1, x2, i As Integer
'随机决定输出字体样式
pic_las.FontItalic = Int(Rnd * 2)
pic_las.FontUnderline = Int(Rnd * 2)
pic_las.ForeColor = RGB(Rnd * 155 + 100, Rnd * 155 + 100, Rnd * 155 + 100)
'为验证码添加随机直线
For i = 1 To (Int(Rnd(1) * 8) + 1)
x = Int(Rnd * pic_las.Width): y = Int(Rnd * pic_las.Height)
x1 = Int(Rnd * pic_las.Width): Y1 = Int(Rnd * pic_las.Height)
pic_las.Line (x, y)-(x1, Y1), RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Next i
'为验证码随机添加圆点
For i = 1 To (Int(Rnd(1) * 200) + 100)
pic_las.PSet (pic_las.Width * Rnd, pic_las.Height * Rnd), _
RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Next i
'写入输出文件
If chk_file.Value = 1 Then
SavePicture pic_las.Image, txt_outfile.Text
MsgBox "验证码已经保存在:" & txt_outfile.Text, VBInformation
End If
Exit Sub
Err1: '产生了错误
MsgBox Err.Number & ":" & Err.Description, VBExclamation
End Sub
内容处理好了,接下来就只要简单响应用户的操作即可。在这里我们还需要解决随机生成验证码的问题,我们可以把需要生成的验证码每一位都放入一个字符串,再用随机函数以及字符串截取函数Mid(String,Start As Long,[Length])读入每一位验证码。另外为了增强程序的功能,我还允许用户保存和拷贝验证码以及允许用户自行定义验证码。由于版面有限,这里就不给出完整的源程序了,你可以从http://www.cfan.com.cn/11program/200513/VBpass.zip下载到完整的源代码。
总结
运行一下程序,“加密”效果还不错吧。
这可不是一般的破解机器能识别得了的哦!当然你也可以将这个加密算法运用到你个人的程序和论坛上去,它为程序的安全性提供了很好的保证呢!
随机图片验证码的制作
最新推荐文章于 2024-09-04 09:00:00 发布