java图片处理。原文章路径:https://www.cnblogs.com/puqiuxiaomao/p/3854046.html
需求:浏览的图片需要在1M一下。
1. 真正对图片的质量进行压缩的(不是通过修改图片的高,宽进行缩小图片。就单单缩小图片质量)
优点:不修改图片大小,简便。
缺点:对jpg格式能处理很好,对于gif,png其他格式不适合。
compressPic(图片路径,处理格式);
1. /**
2. *
3. * 修改图片大小
4. * <p>描述</p>
5. * @date 2014-7-10 下午4:27:51
6. * @version
7. * @param srcFilePath
8. * @param fileExtName
9. * @return
10. * @throws IOException
11. */
12. public static boolean compressPic(String srcFilePath,String fileExtName) throws IOException {
13. File file = null;
14. BufferedImage src = null;
15. FileOutputStream out = null;
16. ImageWriter imgWrier;
17. ImageWriteParam imgWriteParams;
18.
19.
20. long start1 = System.currentTimeMillis();
21. // 指定写图片的方式为 jpg
22. imgWrier = ImageIO.getImageWritersByFormatName(fileExtName).next();
23. imgWriteParams = imgWrier.getDefaultWriteParam();
24. // imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(
25. // null);
26. // imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(
27. // null);
28.
29.
30. imgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
31. // 这里指定压缩的程度,参数qality是取值0~1范围内,
32. imgWriteParams.setCompressionQuality((float) 0.2);
33. //imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);//
34. ColorModel colorModel =ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault();
35. // 指定压缩时使用的色彩模式
36.
37. imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(
38. colorModel, colorModel.createCompatibleSampleModel(16, 16)));
39.
40. long end1 = System.currentTimeMillis();
41. System.out.println("11111消耗时间:"+((double)end1-(double)start1)/1000+"秒");
42. try {
43. if (isBlank(srcFilePath)) {
44. return false;
45. } else {
46. file = new File(srcFilePath);
47. src = ImageIO.read(file);
48. out = new FileOutputStream(srcFilePath);
49.
50. System.out.println("22222");
51. imgWrier.reset();
52.
53. // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何
54. // OutputStream构造
55. imgWrier.setOutput(ImageIO.createImageOutputStream(out));
56. System.out.println("3333333");
57. // 调用write方法,就可以向输入流写图片
58.
59. long start4 = System.currentTimeMillis();
60. imgWrier.write(null, new IIOImage(src, null, null),
61. imgWriteParams);
62. long end4 = System.currentTimeMillis();
63.
64. System.out.println("4444消耗时间:"+((double)end4-(double)start4)/1000+"秒");
65.
66. src.flush();
67. out.flush();
68. out.close();
69. imgWrier.dispose();
70. }
71. } catch (Exception e) {
72. e.printStackTrace();
73. return false;
74. }
75. return true;
76. }
77.
78.
79. /**
80. *
81. * 修改单独图片大小
82. * <p>描述</p>
83. * @date 2014-7-10 下午4:26:30
84. * @version
85. * @param filePath
86. * @param createType
87. * @throws Exception
88. */
89. public static void changeNoneImgSize(String filePath,String createType) throws Exception
90. {
91. File tempFile = new File(filePath);
92. if(tempFile.length()>ImagesUtils.IMAGEMAXSIZE){
93.
94. long start = System.currentTimeMillis();
95.
96.
97. compressPic(filePath,createType);
98. long end = System.currentTimeMillis();
99.
100.
101. System.out.println(filePath+"消耗时间:"+((double)end-(double)start)/1000+"秒");
102. }
103.
104. }
105.
106.
107. /**
108. *
109. * 修改多个图片大小
110. * <p>描述</p>
111. * @date 2014-7-10 下午4:26:52
112. * @version
113. * @param file
114. * @throws Exception
115. */
116. public static void changeManyImgSize(File file) throws Exception
117. {
118. try {
119. // 判断文件是否是文件,如果是文件,获取路径,并计数
120. if (file.isFile()) {
121. String fileExtName = file.getName().substring(
122. (file.getName().lastIndexOf(".") + 1), file.getName().length());
123. if(ImagesUtils.isImageFile(fileExtName))
124. changeNoneImgSize(file.getAbsolutePath(), fileExtName);
125. //ImagesUtils.changeImgSize(file.getAbsolutePath(), ImagesUtils.CREATENEWIMAGETYPE_6);
126. } else {
127. // 如果是文件夹,声明一个数组放文件夹和他的子文件
128. File[] f = file.listFiles();
129. // 遍历文件件下的文件,并获取路径
130. for (File file2 : f) {
131. changeManyImgSize(file2);
132. }
133. }
134. } catch (RuntimeException e) {
135. e.printStackTrace();
136. }
137. }
2. 这种需要用到一个java-image-scaling-0.8.5.jar包。这种需要设定宽高(我是按照原来比例走的。宽是按照两个A4的宽度走),jar我这里提供出来:http://pan.baidu.com/s/1c0pekVm
优点:简单,格式支持还行。我测试了gif,png都可以用、
缺点:宽高需要设定。
1. public static boolean compressPic(String srcFilePath,String fileExtName) throws IOException {
2.
3.
4. try {
5. BufferedImage sourceImage = ImageIO.read(new File(srcFilePath));
6. int newwidth = 1700;
7. double newheight = ((double) sourceImage.getHeight() / (double) sourceImage.getWidth()) * 1700;
8. ResampleOp resizeOp = new ResampleOp(newwidth, (int) newheight);
9. resizeOp.setFilter(ResampleFilters.getTriangleFilter());
10. BufferedImage resizedImage = resizeOp.filter(sourceImage, null);
11. ImageIO.write(resizedImage, "jpg", new File(srcFilePath));
12. } catch (Exception e) {
13. log.error("compressPic error", e);
14. return false;
15. }
16. return true;
}