java学习笔记(中级篇)—java实现高质量图片压缩
程序员文章站
2023-11-15 19:46:34
使用java几十行代码实现一个高质量图片压缩程序,再也不用去自己找网络的压缩程序啦!而且很多网上的工具还有水印或者其他的限制,自己动手写一个简单的应用,是再合适不过了。 一、实现原理 1、声明两个字符串变量,分别是要压缩图片的路径和压缩后图片的存放路径 2、利用字符串的方法lastIndexOf,找 ......
使用java几十行代码实现一个高质量图片压缩程序,再也不用去自己找网络的压缩程序啦!而且很多网上的工具还有水印或者其他的限制,自己动手写一个简单的应用,是再合适不过了。
一、实现原理
1、声明两个字符串变量,分别是要压缩图片的路径和压缩后图片的存放路径
private string brfore_image_path = "d:\\01.jpg"; private string after_image_path = "d:\\temp";
2、利用字符串的方法lastindexof,找到\和.最后出现的位置,目的是匹配到图片文件名。
int begin = brfore_image_path.lastindexof("\\"); int end = brfore_image_path.lastindexof("."); string image_name=brfore_image_path.substring(begin+1,end);
3、创建bufferedimage对象来读取需要压缩的图片
4、获取原始图片的一系列参数
int in_width = bi.getwidth();//图宽 int in_height = bi.getheight();//图高 int in_minx = bi.getminx();//bufferedimage的最小x int in_miny = bi.getminy();//bufferedimage的最小y int type = bi.gettype();//返回图像类型 int out_width = in_width;//要输出图像的宽 int out_height = in_height;//要输出图像的高 int multiple = 1;//系数
5、压缩核心代码,可自己调试找最适合的临界值,我选取的是大于1000000像素点时就压缩一半
while(out_width * out_height > 1000000){ out_width = out_width/2; out_height = out_height/2; multiple = multiple * 2; }
6、创建新的bufferedimage对象,把新的参数传进去,并根据系数把一个个像素点写进图片。
for(int i=0;i<out_width;i++) { for(int j =0;j<out_height;j++) { intpixel=bi.getrgb(i*multiple+in_minx,j*multiple+in_miny); ut_image_martrix.setrgb(i, j, pixel); } }
7、把新的bufferedimage对象写到你要保存压缩图片的地址就好了。
二、完整代码
public class compressimage { private string brfore_image_path = "d:\\01.jpg"; private string after_image_path = "d:\\temp"; public compressimage(){ } public void get_image(){ int begin = brfore_image_path.lastindexof("\\"); int end = brfore_image_path.lastindexof("."); string image_name = brfore_image_path.substring(begin+1,end); file in_file = new file(brfore_image_path); bufferedimage bi = null; try { bi = imageio.read(in_file); }catch(exception e) { e.printstacktrace(); } int in_width = bi.getwidth(); int in_height = bi.getheight(); int in_minx = bi.getminx(); int in_miny = bi.getminy(); int type = bi.gettype(); int out_width = in_width; int out_height = in_height; int multiple = 1; //具体的值可调 while(out_width * out_height > 1000000){ out_width = out_width/2; out_height = out_height/2; multiple = multiple * 2; } bufferedimage out_image_martrix = new bufferedimage(out_width, out_height, type); for(int i=0;i<out_width;i++) { for(int j =0;j<out_height;j++) { int pixel =bi.getrgb(i*multiple+in_minx, j*multiple+in_miny); out_image_martrix.setrgb(i, j, pixel); } } try{ after_image_path = after_image_path + image_name + ".jpg"; imageio.write(out_image_martrix,"jpg", new file(new_path)); bi = null; out_image_martrix = null; }catch(exception e){ e.printstacktrace(); } } //测试代码 public static void main(string[] args) { new compressimage().get_image(); } }
三、总结
代码挺简单的,但是自己动手实现完成一个小功能也不一样哦,而且我觉得压缩的质量还挺高的,所以把自己的实现思路和代码分享出来。有兴趣的童鞋可以自己复制上面的完整代码,只要改成自己的路径就可以运行了。当然啦,几行代码无法媲美专业的压缩工具啦~
最后,喜欢我文章的小伙伴就关注一下我的公众号吧~
上一篇: 百度加大清理新闻源力度
下一篇: 手机建站必备操作:数据、SEO优化