多图片上传,涉及图片的压缩处理(未完)

//多图片上传处理
public @ResponseBody String personInsure(HttpServletRequest request, @RequestParam("files") MultipartFile[] files,String policyFormerNo, String mobile, String ifCancelInsure){
   //图片文件不能为null
 	if(files!=null&& files.length()>0){
		//定义后缀
		String suffix=".jpg";
		//定义总大小标识
		int totalSize=0;
		//定义数组,将文件放入数组中
		List
   
   
    
     listf=new ArrayList
    
    
     
     ();
		//循环图片,
		for(MultipartFile f : file){
			//根据现在的毫秒数创建一个.jPG格式的文件
			String prefix=String.valueOf(DaateUtils.getMillis()); //前缀
			File file=File.createTempFile(prefix,suffix);
			//将MultipartFile转换成File文件、图片
			f.transferTo(file);
			//获取图片的绝对路径,以便下面压缩使用
			String FileNamePreffix=file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."));
			//判断当前的file图片的大小是否满足 约定的文件大小
			if(file.length()>100*1024){
				//不满足,压缩图片,将压缩完的图片放回原路径
				cutImg(file,fileNamePreffix.suffix,0.9);
			}
			listf.add(file);//添加到集合
			//将图片的大小从String类型转换成Integer类型,计算图片的总大小
			Integer in=Integer.valueOf(String.valueOf(file.length()));
			totalSize+=in;
		}
		//判断图片的总大小是否超过预定上传的大小
		if(totalSize+>2000*1024){ //上传图片的总大小不能超过200M
		   //压缩后还是超过规定的大小,返回提示
		   return;
		}
		//下面上传图片至服务器	
		//为了优化上传,先将图片进行压缩
		
		
		//创建压缩文件存储名称以  .zip 结尾
		String prefix = String.valueOf(DateUtils.getMillis());
		File file=File.createTemFile("prefix",".zip");
		FileOutputStream fileOutputStream=new FileOutputStream(file);//定义输出流
		ZipOutputStream zipOutputStream=new ZipOutputStream(fileOutputStream);//定义压缩流
		FileInputStream fileInputStream=null;//声明输入流
		BufferedInputStream bufferInputStream=null;

		byte[] byte=new byte[2000*1024];//创建用于存放数据的数组
		//判断集合是否为空
		if(listf!=null&&!listf.isEmpty()){
			for(File files:listf){
			        //创建一个以System.currentTimeMillis() + suffix为名称的子文件
				ZipEntry zipEntry=new ZipEntry(System.currentTimeMillis() + suffix);
				//创建压缩的子文件,每一个子文件使用ZipEntry表示
				zipOutputStream.putNextEntry(zipEntry);
				//定义输入流对象
				fileInputStream=new fileInputStream(files);
				//创建具有指定缓冲区的bufferInputStream,并保存其参数
				bufferInputStream=new bufferInputStream(fileInputStream,2000*1024);
				int temp=0;
				//读取内容
				while((temp=bufferInputStream.read(byte,0,1024*2000))!=-1){
					zipOutputStream.write(byte,0,temp);
				}
				files.delete();
			}
		
		}

		//下面通过自己项目的接口将file作为参数,传到其他平台

	}


}

//压缩图片
public void cutImg(File fiel,String FileNamePreffix,String suffix,double scale){
	if(scale<=0){
		return;//压缩比例<=0,返回
	}
	Thumbnails.of(file).scale(scale).outputFormat("jpg").toFile("fileNamePreffix");//按比例缩放,至fileNamePreffix路径下
	//再次读取次路径下的图片,获取大小,不满足继续压缩
	file=new File(fileNamePreffix+suffix);
	if(file.length()>100*1024){
	  scale-=0.1;//缩放比例-0.1
	  cutImg(file,fileNamePreffix,suffix,scale);//递归
	}

	
}
// Java图片处理 Thumbnails框架
第一步:导入maven的jar包

     
     
    
      
      
       
       net.coobird
      
      
    
      
      
       
       thumbnailator
      
      
    
      
      
       
       0.4.8
      
      

     
     
第二步:直接在方法中调用:如Thumbnails.of(file).scale(scale).outputFormat("jpg").toFile("fileNamePreffix");
//下面是操作图片的各种方法,有的是借鉴别人的成果
加载图片源:Thumbnails.of(file)
1.	File file = new File("/Users/qiangzi/data/img","beauty.jpg");
2.	Builder
     
     
      
       builder = Thumbnails.of(file);
缩放:
1.	builder = builder.scale(0.9);   //参数是浮点数,大于1表示放大,小于1表示缩小
质量压缩:
1.	builder.outputQuality(0.9); //参数是浮点数,0-1之间
剪裁:
1.	builder.sourceRegion(100, 100, 300, 300);    
2.	builder.sourceRegion(Positions.CENTER, 200, 200);
根据宽度来缩放:
1.	builder.width(500);
根据高度来缩放:
1.	builder.height(500);
在调整尺寸时保持比例:
1.	builder.keepAspectRatio(true);  //默认为true,如果要剪裁到特定的比例,设为false即可
根据宽度和高度进行缩放:
1.	builder.size(600, 700);
2.	//如果设置了keepAspectRatio(true),将按比例进行缩放,否则将强制按尺寸输出
3.	缩放策略:
4.	如果宽度缩放比>高度缩放比就以宽度来缩放,反之以高度缩放
将图片放入内存:
1.	File file2 = new File("/Users/qiangzi/data/img","logo.png");
2.	BufferedImage bufferedImage = Thumbnails.of(file2).scale(1.0).outputQuality(1.0).asBufferedImage();
3.	*必须要指定scale

加水印:
1.	builder.watermark(Positions.BOTTOM_RIGHT, bufferedImage, 1.0f);
2.	//第一个参数是加水印的位置
3.	//第二个参数是要加水印的图片
4.	//第三个参数是水印图片的透明度
5.	经过测试:gif图片的彩色会变成黑白,所以尽量使用jpg或png图片吧
输出图片,不管对图片进行什么操作,只有输出才能看到效果:
1.	builder.toFile(File file);
*注意:scale、width|height、size三者不能同时共存,但必须要有一个
转化图像格式
         /**
         * outputFormat(图像格式)
         */
        Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("C:/image_1280x1024.png");
        Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("C:/image_1280x1024.gif");
案例:
1.	//将原图缩放到宽度为500,压缩质量90%
2.	Thumbnails.of(file).width(500).outputQuality(0.9).toFile(file);
3.	//将原图按比例缩放,最宽300,最高400,不进行质量压缩
4.	Thumbnails.of(file).size(300, 400).outputQuality(1.0).toFile(file);

     
     
    
    
   
   


//下面是解压的,注意文件的名称不能是中文,否则会异常。

//解压
//读取压缩文件
File file=new File("C:\\Users\\Administrator\\AppData\\Local\\Temp\\Excel.zip");
System.out.println(file.getName());
File file2=null;

//实例化ZipFile对象
ZipFile zipFile=new ZipFile(file);
System.out.println(zipFile.getName());//  Excel.zip

//创建文件流
FileInputStream fileInputStream=new FileInputStream(file);
ZipInputStream zipInputStream=new ZipInputStream(fileInputStream);
//每一个压缩实体
ZipEntry entry=null;
while ((entry=zipInputStream.getNextEntry())!=null) {//得到一个压缩实体
file2=new File("C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Temp\\\\"+entry.getName());  //定义文件的输出路径
System.out.println("entry.getName():"+entry.getName());
//entry.getName():Excel/WEIXIN_20170619.xls
//entry.getName():Excel/WEIXIN_201709.xls
//创建文件夹
if(!file2.getParentFile().exists()) { //返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
file2.getParentFile().mkdir();
}
if(!file2.exists()) {
file2.createNewFile();//创建文件
}

InputStream inputStream=zipFile.getInputStream(entry);//得到每一个实体的输入流
OutputStream outputStream=new FileOutputStream(file2);//实例化文件输出流
int temp=0;
while ((temp=inputStream.read())!=-1) {
outputStream.write(temp);
}

}




http://blog.csdn.net/hanshileiai/article/details/6718375


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值