网页中某些图片大的时候,图片会加载慢,这时候需要对图片进行压缩处理,Java有对图片进行压缩处理的方法。
整体思路:
- 页面中显示图片(输出流-->访问本地磁盘上的某张图片)
- 访问的时候动态选择是否想要压缩某张图片(压缩判断)
- 把原始图片复制一份,复制出来的那份给压缩,页面中想要压缩的图片时,就访问压缩后的图片,否则,则显示原图
复制一张图片,输出在原路径下,返回新复制后的路径,修改了原始文件名。
/**
* 把一个大图片copy一份出来作为压缩处理
* @param oldFile
* @return
*/
public static String copyFile(String oldFile){
String outPath = null;
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldFile);
if (oldfile.exists()) { //文件存在时
InputStream inStream = new FileInputStream(oldFile); //读入原文件
int prefix = oldfile.getName().lastIndexOf("."); //取得后缀名的开始位数
String afterPrefix = oldfile.getName().substring(prefix, oldfile.getName().length()); //原始的文件名的后缀名
System.out.println("后缀名是: "+afterPrefix);
String beforePrefix = oldfile.getName().substring(0, prefix); //原始的文件名的前缀名
System.out.println("前缀名是: "+beforePrefix);
System.out.println(oldfile.getParentFile());
System.out.println(oldfile.getParent());
outPath = oldfile.getParentFile()+"/"+beforePrefix+"_copy"+afterPrefix;
System.out.println("======> "+outPath);
//将复制的新图片重新命名
FileOutputStream fs = new FileOutputStream(outPath);
byte[] buffer = new byte[1444];
int length;
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字节数 文件大小
fs.write(buffer, 0, byteread);
}
inStream.close();
}
} catch (FileNotFoundException e) {
System.out.println("图片没找到!");
e.printStackTrace();
} catch (IOException e) {
System.out.println("复制图片出错!");
e.printStackTrace();
}
return outPath;
}
把复制的出来的新图片进行压缩
/***
* 功能 :按照正方形缩放图片,精度较高
* 处理100X100或者别的
* @param srcImgPath 原图片路径
* @param distImgPath 转换大小后图片路径
* @param width 转换后图片宽度
* @param height 转换后图片高度
*/
public static void resizeImage(String srcImgPath, String distImgPath,int width, int height) throws IOException {
String subfix = "jpg";
subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
File srcFile = new File(srcImgPath);
Image srcImg = ImageIO.read(srcFile);
BufferedImage buffImg = null;
if(subfix.equals("png") || subfix.equals("PNG")){
buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
}else{
buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
}
Graphics2D graphics = buffImg.createGraphics();
graphics.setBackground(Color.WHITE);
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
graphics.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
ImageIO.write(buffImg, subfix, new File(distImgPath));
}
图片访问输出流,加标识符是否需要对图片进行压缩处理
/**
* 查看一个图片
* @param proNo
* @param fileName
* @param response
*/
@RequestMapping("/image/{proNo}/{fileName}/{true}")
public void image(@PathVariable("proNo") String proNo,
@PathVariable("fileName") String fileName,
@PathVariable("true") boolean resize,
HttpServletResponse response){
FileInputStream fis = null;
StringBuffer sb = new StringBuffer(20);
try {
// fis = new FileInputStream("D:/stt/products/1611070030000029/2016110700300002964329.png");
String imgPath = StringBufferUtil.append(sb, ManagerConf.getMangerConf().getProductSave(),"/",proNo,"/",fileName).toString();
if(!FileUtil.fileExists(imgPath)){
return;
}
System.out.println(resize);
if(resize){ //首页过来的请求,执行压缩程序
System.out.println("原图片的路径:==========>" + imgPath);
System.out.println("执行复制图片开始:....");
String nowPath = copyFile(imgPath);
System.out.println("执行复制图片结束:....");
System.out.println("新复制图片的路径为:=======>" + nowPath);
System.out.println("开始压缩图片程序:....");
resizeImage(nowPath, nowPath, 100, 100);
System.out.println("开始压缩图片结束:....");
ServletOutputStream os = response.getOutputStream();
fis = new FileInputStream(nowPath);
byte[] bs = new byte[fis.available()];
fis.read(bs);
os.write(bs);
}else{
ServletOutputStream os = response.getOutputStream();
fis = new FileInputStream(imgPath);
byte[] bs = new byte[fis.available()];
fis.read(bs);
os.write(bs);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fis != null)fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试
这是URL最后标识符为true的时候,代表进行图片压缩。
这是URL最后标识符为false的时候,图片未进行压缩处理。
ok,到这里就完毕了。
我的博客文章地址:http://www.hanyz.cn/2017/06/28/Java%E5%9B%BE%E7%89%87%E5%8E%8B%E7%BC%A9%E5%A4%84%E7%90%86/