先看效果
要看懂代码,先搞懂这些方法
Image类
Image 类并不可以直接构建图片对象,因为它是一个抽象类。
我们通过 BufferedImage 方法来构造
BufferedImage(int width,int height,int imgeType)
创建指定大小、指定图像类型的 BufferedImage对象。
BufferedImage 构建好指定大小和类型的图像对象后,我们用Java提供的画笔工具
Graphics2D pen = (Graphics2D) image.getGraphics();
有了画笔就开始画呗
pen.setColor(Color.RED) 这个方法是给画笔上色的
pen.fillRect(0,0,80,20) 这个方法是给我们构造的矩形图片填充颜色用的,颜色就是刚刚画笔的颜色,参数是指从坐标(0,0)填充到(80,20)
pen.drawString(String str) 这个方法是用画笔画一个字符串,在后面我们的验证码的数字或字母就是这个方法画上去的
ImageIO
画好图片得存起来,我们通过ImageIO来写到磁盘中去
write(image,"jpg",new FileOutputStream("D:/b.jpg")) 这个方法就是把二进制字节文件写到磁盘中去,注意计算机中除了文本是字符文件,其他都是二进制文件。参数:image就是我们刚刚那个BufferedImage的实例化对象,jpg是我们将要保存的格式,new FileOutPutStream("D:/b.jpg")就是标准的字节输出流,参数"D:/b.jpg"就是我们的二进制文件将要写到的位置
到此为止,我们生成了我们的图片文件,下一步,怎么让Java读取到我们的文件呢?
new FileInputStream(path)
二进制输入流,用于读取二进制文件
Image
上面我们说Image不能够创建图片实例,但是它可以通过参数-字节输入流来实例化Image对象
new Image(inStream) 通过这个方法实例化Image对象,其中参数inStream是上面FileInputStream字节输入流的实例化对象。
ImageView
这个方法用于JavaFX设置图片时,存放Image参数
new ImageView(image) 我们实例化ImageView对象,参数是上面Image的实例化对象
setGraphic(ImageView imageView) 这个方法就是我们最后给组件设置图片的方法,参数就是上面的ImageView的实例化对象
代码
/** * 生成验证码图片 */ public static String createImage(){ //绘制验证码 //在内存中创建图片 BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D pen = (Graphics2D) image.getGraphics(); //画笔 //设置图片的背景颜色 pen.setColor(Color.WHITE); pen.fillRect(0,0,80,20);//填充背景,从(0,0)到(80,20) //给图片写数据 pen.setColor(Color.BLUE); pen.setFont(new Font(null,Font.BOLD,20)); //pen.drawString(makeNum(),0,20);//数字验证码 String code=createCode(5);//字母验证码,参数是验证码的长度 pen.drawString(code,0,20); try { ImageIO.write(image, "jpg", new FileOutputStream("D:/b.jpg")); } catch (IOException e) { e.printStackTrace(); } return code; } /** * 返回英文验证码(包含大小写) * @param len 期望的验证码长度 * @return 返回验证码 */ public static String createCode(int len){ StringBuilder result=new StringBuilder(); char[] words=new char[len]; for (int i = 0; i < len; i++) { int code=0; //大小写字母都有出现的概率 if((int)(Math.random()*i%2)==0)//得到大写字母 code=(int)(Math.random()*26+65); else//得到小写字母 code=(int)(Math.random()*26+97); words[i]=(char)code; } //将生成的字母拼接成字符串返回 for(char word:words){ result.append(word); } return String.valueOf(result); }