java input 调用手机相机和本地照片上传图片到服务器然后压缩的方法
在微信公众号里面需要上传头像,时间比较紧,调用学习jssdk并使用来不及就用了input
1、使用input:file标签,去调用系统默认相机,摄像,录音功能,其实是有个capture属性,直接说明需要调用什么功能
capture表示,可以捕获到系统默认的设备,比如:camera--照相机;camcorder--摄像机;microphone--录音。
accept表示,直接打开系统文件目录。
2、input:file标签还支持一个multiple属性,表示可以支持多选,如:
加上这个multiple后,capture就没啥用了,因为multiple是专门用来支持多选的。
用form表单提交
上传之后图片显示在页面上
js
后台接收以及压缩
@PostMapping("/uploadtou.do")
publicStringuploadtou(@RequestParam(value="file")MultipartFilefile,HttpServletRequestrequest)throwsIOException{
System.out.println(file);
Stringresult="";
if(!file.isEmpty()){
try{
Shopuseru=(Shopuser)request.getSession().getAttribute("currentUser");
StringextName=file.getOriginalFilename();
StringfileName=file.getName();
Stringsuffix=extName.substring(extName.lastIndexOf(".")+1);
System.err.println(suffix);
Datenow=newDate();
SimpleDateFormatoutFormat=newSimpleDateFormat("yyyyMMddHHmmss");
Strings=outFormat.format(now);
BufferedOutputStreambos=newBufferedOutputStream(
newFileOutputStream(newFile("D:\\xiangmu\\demo\\"+s+"."+suffix)));
bos.write(file.getBytes());
bos.flush();
bos.close();
/**
*compress图片缩放类的使用(缩略图)
*srcImage为InputStream对象
*Rectangle为需要截图的长方形坐标
*proportion为压缩比例
***/
InputStreamin=null;
//缩放后需要保存的路径
FilesaveFile=newFile("D:\\xiangmu\\demo\\"+s+s+"."+suffix);
try{
//原图片的路径
in=newFileInputStream(newFile("D:\\xiangmu\\demo\\"+s+"."+suffix));
intlength=in.available();
if(length/1024>=10&&length/1024<100){
if(compress(in,saveFile,10)){
System.out.println("图片压缩十倍!");
}
}elseif(length/1024>=100&&length/1024<1000){
if(compress(in,saveFile,100)){
System.out.println("图片压缩100倍!");
}
}elseif(length/1024>=1000&&length/1024<10000){
if(compress(in,saveFile,1000)){
System.out.println("图片压缩1000倍!");
}
}elseif(length/1024<10&&length/1024>0){
if(compress(in,saveFile,1)){
System.out.println("图片压缩1倍!");
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
in.close();
}
Stringfilename="/Path/"+s+s+"."+suffix;//服务器地址
System.out.println(filename);
inta=shopService.updateImg(u.getId(),filename);
System.out.println(filename);
}catch(Exceptione){
e.printStackTrace();
}
}else{
}
return"wode.html";
}
图片处理类
packagecom.example.springbootshop.util;
importorg.junit.Test;
importjava.awt.Graphics2D;
importjava.awt.Rectangle;
importjava.awt.RenderingHints;
importjava.awt.geom.AffineTransform;
importjava.awt.image.BufferedImage;
importjava.awt.image.ColorModel;
importjava.awt.image.WritableRaster;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStream;
importjavax.imageio.ImageIO;
/**
*图片工具类,完成图片的截取
*所有方法返回值均未boolean型
*/
publicclassImageHelper{
/**
*实现图像的等比缩放
*@paramsource
*@paramtargetW
*@paramtargetH
*@return
*/
privatestaticBufferedImageresize(BufferedImagesource,inttargetW,
inttargetH){
//targetW,targetH分别表示目标长和宽
inttype=source.getType();
BufferedImagetarget=null;
doublesx=(double)targetW/source.getWidth();
doublesy=(double)targetH/source.getHeight();
//这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
//则将下面的ifelse语句注释即可
if(sx0||hight>0){
//原图的大小
intsw=srcImage.getWidth();
intsh=srcImage.getHeight();
//如果原图像的大小小于要缩放的图像大小,直接将要缩放的图像复制过去
if(sw>width&&sh>hight){
srcImage=resize(srcImage,width,hight);
}else{
StringfileName=saveFile.getName();
StringformatName=fileName.substring(fileName
.lastIndexOf('.')+1);
try{
ImageIO.write(srcImage,formatName,saveFile);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
returntrue;
}
}
//缩放后的图像的宽和高
intw=srcImage.getWidth();
inth=srcImage.getHeight();
//如果缩放后的图像和要求的图像宽度一样,就对缩放的图像的高度进行截取
if(w==width){
//计算X轴坐标
intx=0;
inty=h/2-hight/2;
try{
saveSubImage(srcImage,newRectangle(x,y,width,hight),saveFile);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
}
//否则如果是缩放后的图像的高度和要求的图像高度一样,就对缩放后的图像的宽度进行截取
elseif(h==hight){
//计算X轴坐标
intx=w/2-width/2;
inty=0;
try{
saveSubImage(srcImage,newRectangle(x,y,width,hight),saveFile);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
}
returntrue;
}
/**
*实现图像的等比缩放和缩放后的截取,处理成功返回true,否则返回false
*@paramin图片输入流
*@paramsaveFile压缩后的图片输出流
*@paramproportion压缩比
*@throwsException
*/
publicstaticbooleancompress(InputStreamin,FilesaveFile,intproportion){
if(null==in
||null==saveFile
||proportion<1){//检查参数有效性
//LoggerUtil.error(ImageHelper.class,"--invalidparameter,donothing!");
returnfalse;
}
BufferedImagesrcImage=null;
try{
srcImage=ImageIO.read(in);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
//原图的大小
intwidth=srcImage.getWidth()/proportion;
inthight=srcImage.getHeight()/proportion;
srcImage=resize(srcImage,width,hight);
//缩放后的图像的宽和高
intw=srcImage.getWidth();
inth=srcImage.getHeight();
//如果缩放后的图像和要求的图像宽度一样,就对缩放的图像的高度进行截取
if(w==width){
//计算X轴坐标
intx=0;
inty=h/2-hight/2;
try{
saveSubImage(srcImage,newRectangle(x,y,width,hight),saveFile);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
}
//否则如果是缩放后的图像的高度和要求的图像高度一样,就对缩放后的图像的宽度进行截取
elseif(h==hight){
//计算X轴坐标
intx=w/2-width/2;
inty=0;
try{
saveSubImage(srcImage,newRectangle(x,y,width,hight),saveFile);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
}
returntrue;
}
/**
*实现缩放后的截图
*@paramimage缩放后的图像
*@paramsubImageBounds要截取的子图的范围
*@paramsubImageFile要保存的文件
*@throwsIOException
*/
privatestaticvoidsaveSubImage(BufferedImageimage,
RectanglesubImageBounds,FilesubImageFile)throwsIOException{
if(subImageBounds.x<0||subImageBounds.y<0
||subImageBounds.width-subImageBounds.x>image.getWidth()
||subImageBounds.height-subImageBounds.y>image.getHeight()){
//LoggerUtil.error(ImageHelper.class,"Badsubimagebounds");
return;
}
BufferedImagesubImage=image.getSubimage(subImageBounds.x,subImageBounds.y,subImageBounds.width,subImageBounds.height);
StringfileName=subImageFile.getName();
StringformatName=fileName.substring(fileName.lastIndexOf('.')+1);
ImageIO.write(subImage,formatName,subImageFile);
}
@Test
publicstaticvoidmain(String[]args)throwsException{
/**
*saveSubImage截图类的使用
*srcImage为BufferedImage对象
*Rectangle为需要截图的长方形坐标
*saveFile需要保存的路径及名称
***/
//需要截图的长方形坐标
/*Rectanglerect=newRectangle();
rect.x=40;
rect.y=40;
rect.height=160;
rect.width=160;
InputStreamin=null;
//需要保存的路径及名称
FilesaveFile=newFile("d:\\ioc\\files\\aaa2.jpg");
//需要进行处理的图片的路径
in=newFileInputStream(newFile("d:\\ioc\\files\\aaa.jpg"));
BufferedImagesrcImage=null;
//将输入的数据转为BufferedImage对象
srcImage=ImageIO.read(in);
ImageHelperimg=newImageHelper();
img.saveSubImage(srcImage,rect,saveFile);*/
/**
*compress图片缩放类的使用(缩略图)
*srcImage为InputStream对象
*Rectangle为需要截图的长方形坐标
*proportion为压缩比例
***/
InputStreamin=null;
//缩放后需要保存的路径
FilesaveFile=newFile("D:\\xiangmu\\demo\\20180523192742IMG_0049123.jpg");
try{
//原图片的路径
in=newFileInputStream(newFile("D:\\xiangmu\\demo\\20180523192742IMG_0049.jpg"));
if(compress(in,saveFile,10)){
System.out.println("图片压缩十倍!");
}
}catch(Exceptione){
e.printStackTrace();
}finally{
in.close();
}
}
}
以上这篇javainput调用手机相机和本地照片上传图片到服务器然后压缩的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。