多圖片上傳,涉及圖片的壓縮處理(未完)

//多圖片上傳處理
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.coobirdthumbnailator0.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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章