java生成验证码
照着哔站上的教学视屏写了一个java小项目。真的是一看就会,一学就废,刚开始的时候一句一个错。。。主要还是水平太低,遇到问题不会解决。
代码:
package imagecode;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
public class ImageCode{
//数组
static String[] strs = {"a","b","c","d","e","f","g","h","i",
"j","k","l","m","n","o","p","q","r","s","t","u","v",
"w","x","y","z","2","3","4","5","6","7","8","9"};
public static void main(String[] args) throws IOException{
int w = 150;
int h = 50;
int imageType = java.awt.image.BufferedImage.TYPE_INT_RGB; //值为1
BufferedImage image = new BufferedImage(w,h,imageType); //创建一个图片(画板)
Graphics g = image.getGraphics(); //生成画笔g
g.setColor(Color.blue); //设置画笔的颜色
g.fillRect(0, 0, w, h);//画一个实心的矩形,覆盖了画布
//将验证码写在矩形里
g.setColor(Color.pink); //画笔换一个颜色
g.setFont(new Font("楷体",Font.PLAIN,25));//设置字体
Random random = new Random();
int x = 30; //定义第一个字符的位置
int y = 30;
//在数据中随机取4个字符
for(int i = 0;i < 4; i++) {
int num = random.nextInt(strs.length); //在[0,length-1]之间取一个随机数
String str = strs[num];
g.drawString(str, x, y);
x += 25;
}
//画干扰线,画5条
g.setColor(Color.green);
for(int i = 0;i < 5; i++) {
int x1 = random.nextInt(30);
int y1 = random.nextInt(50);
int x2 = random.nextInt(30)+120;
int y2 = random.nextInt(50);
g.drawLine(x1,y1,x2,y2);
}
ImageIO.write(image,"jpg",new File("./output/aaa.jpg")); //把图片存下来
}
}
下面我总结一下我遇到的问题和解决的方法(很多都不科学):
1、这个问题我都不好意思说,java每一个文件都有一个公共类,主函数就在这个类里。注意这个类的名字必须和文件名一致。。。
2、BufferedImage image = new BufferedImage(w,h,imageType);在使用第三方库的函数时要import调用第三方库。这个我真的很冤,我写了import的语句,但是他说我的无效。然后按照它提供的方法我导入了库,但是按它的方法生成的import语句和我的一模一样,连位置都一样。。。
3、在写路径的时候建议写成相对路径,这样代码的移植能力强。文件的根目录是你的workspace/projectname/,所以直接写成./output/aaa.jpg或者.\output\aaa.jpg都可以定位到output文件夹中的一张叫aaa的图片。这个output文件夹和src在同一个目录下。不要忘记前面的点哦。
4、在Java中除了RuntimeException及其任何子类,其他异常类都被Java的异常强制处理机制强制异常处理。关于那些被强制异常处理的代码块,必须进行异常处理,否则编译器会提示“Unhandled exception type Exception”错误警告。
Java中用于处理异常的方式
自行处理:可能引发异常的语句封入在try内,而处理异常的相应语句则封入catch块内
回避异常:在方法声明中包含throws子句,通知潜在调用者,如果发生了异常,必须由调用者处理。ImageIO.write(image,“jpg”,new File(“./output/aaa.jpg”));就必须进行异常处理,我选择throws,在主函数后面加一个throws IOException就好啦,毕竟try…catch不会写。。。