图⽚滑块校验JAVA后端实现⽅式
⾸先我们写 图⽚剪切⼯具类ImgCutUtil
说⽩了就是通过这个⼯具获取⼀个裁剪图⽚的编码
(⼀)获取裁剪图⽚相关信息
1.裁剪图⽚获取图⽚转换流base64
代码前半段是转换流操作,裁剪参数确保随机⽣成
Map<Object,Object> map =new HashMap<Object,Object>();
Random rand =new Random();
int ImgIndex = Int(6);//⽣成0-6以内的随机数
if(ImgIndex==0){
ImgIndex =1;
}
//String path = ClassPath()+"baseImg/"+ImgIndex+".jpg";//
String path ="e://aoteman.png";//
System.out.println("图⽚路径-->"+path);
File picture =new File(path);
BufferedImage sourceImg = ad(new FileInputStream(picture));
BASE64Encoder enco =new BASE64Encoder();
//原图
ByteArrayOutputStream YYbao =new ByteArrayOutputStream();//io流
ImageIO.write(sourceImg,"jpg", YYbao);//写⼊流中
byte[] bytess = ByteArray();//转换成字节
String src_base64 = deBuffer(bytess).trim();//转换成base64串
src_base64 = placeAll("\n","").replaceAll("\r","");//删除 \r\n
map.put("src_base64",src_base64)
/*************************裁剪图⽚获得base64*************************/
int CJX= Int(200);//⽣成0-700以内的随机数
// int CJX = Int(400); //⽣成0-700以内的随机数
int CJY= Int(100);//⽣成0-480以内的随机数
// int CJY = Int(300); //⽣成0-480以内的随机数
System.out.println("随机x起点-->"+CJX);
System.out.println("随机y起点-->"+CJY);
if(CJX<10){
System.out.println("太少了");
CJX=CJX+100;
System.out.println("增加后-->"+CJX);
}
/*if(CJX<50){
System.out.println("太少了");
CJX = CJX + 50;
System.out.println("增加后-->"+CJX);
}*/
int CutX1 =CJX;//裁剪X轴起点
int CutY1 =CJY;//裁剪Y轴起点
int CutW1 =50;//裁剪宽度
//int CutH1 = 120; //裁剪⾼度
int CutH1 =50;//裁剪⾼度
System.out.println(CutX1+"、"+CutY1+"、"+CutW1+"、"+CutH1);
ImageCut imageCut1 =new ImageCut(CutX1, CutY1, CutW1, CutH1);
String CutPng_base64 = imageCut1.cut(path,null);
/********************************************************/
2.图⽚裁剪的部分变⿊
/************************图⽚局部变⿊************************/
for(int i =0; i < Width(); i++){
for(int j =0; j < Height(); j++){
int rgb = data[i][j];
// 原图中对应位置变⾊处理
int rgb_ori = RGB(i, j);
if(rgb ==1){
//颜⾊处理
int r =(0XFF000000& rgb_ori);
int g =(0XFF000000&(rgb_ori >>8));
int b =(0XFF000000&(rgb_ori >>16));
int Gray =(r*2+ g*5+ b*1)>>3;
//原图对应位置颜⾊变化
sourceImg.setRGB( i, j, Gray);
}
}
}
/**********************************************************/
3.让裁剪变⿊后的图⽚转成base64
/************************阴影图⽚转base64************************/
BASE64Encoder encoder =new BASE64Encoder();
ByteArrayOutputStream YYbaos =new ByteArrayOutputStream();//io流
ImageIO.write(sourceImg,"jpg", YYbaos);//写⼊流中
byte[] bytes = ByteArray();//转换成字节
String YYPng_base64 = deBuffer(bytes).trim();//转换成base64串 YYPng_base64
= placeAll("\n","").replaceAll("\r","");//删除 \r\n /**********************************************************/
map.put("CJX",CJX);//裁剪开始X坐标
map.put("CJY",CJY);//裁剪开始Y坐标
map.put("YYPng_base64", YYPng_base64);//阴影图⽚base
map.put("CutPng_base64", CutPng_base64);//裁剪图⽚base
return map;
4.裁剪后的图⽚进⾏流转换操作
/**
* 对图⽚裁剪,并把裁剪完成新图⽚保存。
* @param srcpath 源图⽚路径
* @param subpath 剪切图⽚存放路径
* @throws IOException
*/
public String cut(String srcpath, String subpath,int cutx,int cuty,int cutw,int cuth) throws IOException {
FileInputStream fis =null;
ImageInputStream iis =null;
try{
// 读取图⽚⽂件
fis =new FileInputStream(new File(srcpath));
// 获取⽂件的后缀名
String postFix =getPostfix(srcpath);
//转为指定的解码格式
Iterator<ImageReader> it =getImageReadersByFormatName(postFix);
ImageReader reader = it.next();
// 获取图⽚流
iis = ateImageInputStream(fis);
//iis:读取源.true:只向前搜索 .将它标记为 ‘只向前搜索’。
//此设置意味着包含在输⼊源中的图像将只按顺序读取,可能允许 reader 避免缓存包含与以前已经读取的图像关联的数据的那些输⼊部分。
session如何设置和读取reader.setInput(iis,true);
//描述如何对流进⾏解码的类.⽤于指定如何在输⼊时从 Java Image I/O
//框架的上下⽂中的流转换⼀幅图像或⼀组图像。⽤于特定图像格式的插件将从其 ImageReader 实现的
//getDefaultReadParam ⽅法中返回 ImageReadParam 的实例。
ImageReadParam param = DefaultReadParam();
//图⽚裁剪区域。Rectangle 指定了坐标空间中的⼀个区域,通过 Rectangle 对象的左上顶点的坐标(x,y)、宽度和⾼度可以定义这个区域。 Rectangle rect =new Rectangle(cutx, cuty, cutw, cuth);
// 提供⼀个 BufferedImage,将其⽤作解码像素数据的⽬标。
param.setSourceRegion(rect);
//使⽤所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将它作为⼀个完整的BufferedImage 返回。
BufferedImage bi = ad(0, param);
//io流
ByteArrayOutputStream catBaos =new ByteArrayOutputStream();
//写⼊流中
ImageIO.write(bi,"jpg", catBaos);
//转换成字节
byte[] cutBytes = ByteArray();
BASE64Encoder encoder =new BASE64Encoder();
//转换成base64串
String cutPngBase64 = deBuffer(cutBytes).trim();
//删除 \r\n
cutPngBase64 = placeAll("\n","").replaceAll("\r","");
return cutPngBase64;
}finally{
if(fis !=null){
fis.close();
}
if(iis !=null){
iis.close();
}
}
}
5.根据后缀名称转为指定的解码格式
代码中只放了jpg,png图⽚格式的,根据需求⾃⼰去放。
*/
private static final String IMAGE_FORM_OF_JPG="jpg";
/
**
* png图⽚格式
*/
private static final String IMAGE_FORM_OF_PNG="png";
/**
* 获取后缀名称
* @param inputFilePath 图⽚地址
* @return
*/
public String getPostfix(String inputFilePath){
return inputFilePath.substring(inputFilePath.lastIndexOf(".")+1);
}
/**
* 根据后缀名称转为指定的解码格式
* @param postFix 后缀名称
* @return
*/
public Iterator<ImageReader>getImageReadersByFormatName(String postFix){
switch(postFix){
case IMAGE_FORM_OF_JPG:
ImageReadersByFormatName(IMAGE_FORM_OF_JPG);
case IMAGE_FORM_OF_PNG:
ImageReadersByFormatName(IMAGE_FORM_OF_PNG);
default:
ImageReadersByFormatName(IMAGE_FORM_OF_JPG);
}
}
(⼆)放⼊项⽬进⾏滑块校验
1.获取滑块校验的图⽚
这⾥在ImgCutUtil⾥把图⽚的路径写成本机固定的图⽚了,根据需求⼤家⾃⾏可以动态获取。
* @param session
* @return
* @throws IOException
*/
@RequestMapping(value ="/goUploadImg.do", method = RequestMethod.GET)
@ResponseBody
public Object goUploadImg(HttpSession session) throws IOException {
Map<Object, Object> map =new HashMap<Object, Object>();
//截切图⽚得到横向截距纵向截距和图⽚编码截图编码
map =new ImgCutUtil().getBase();
//⽣成随机数列
String uuid = uuidUtil.uuidReplace();
//前台图⽚展⽰为原图的⼀半
System.out.println(uuid);
int CJX=(int) ("CJX")/2;
System.out.println("hahhhahha"+CJX);
//将⽣成的随机数列和横向截距存⼊session中
session.setAttribute(uuid,CJX);
//返回uuid
map.put("uuid", uuid);
JSONString(map);
}
控制台输出
2.进⾏滑块校验
这⾥说明⼀下 这⾥是把UUID和剪切X轴的距离放⼊Sesion中,便于我们后台随意拿取,校验成功我这⾥让他发送验证码,失败返回状态
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论