使用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();
}
}

三、总结

代码挺简单的,但是自己动手实现完成一个小功能也不一样哦,而且我觉得压缩的质量还挺高的,所以把自己的实现思路和代码分享出来。有兴趣的童鞋可以自己复制上面的完整代码,只要改成自己的路径就可以运行了。当然啦,几行代码无法媲美专业的压缩工具啦~

最后,喜欢我文章的小伙伴就关注一下我的公众号吧~

java学习笔记(中级篇)—java实现高质量图片压缩的更多相关文章

  1. java学习笔记(中级篇)—JDK动态代理

    一.什么是代理模式 相信大家都知道代理商这个概念,在商业中,代理商无处不在.假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商.你要买或 ...

  2. java学习笔记(基础篇)--java关键字与数据类型

    java关键字与数据类型 Java语言的关键字是程序代码中的特殊字符.包括: . 类和接口的声明--class, extends, implements, interface . 包引入和包声明--i ...

  3. java学习笔记(基础篇)—java数组

    一:什么是数组,什么时候使用数组? 数组是用来保存一组数据类型相同的元素的有序集合,数组中的每个数据称为元素.有序集合可以按照顺序或者下标取数组中的元素. 在Java中,数组也是Java对象.数组中的 ...

  4. Java学习笔记心得——初识Java

    初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开 ...

  5. Java学习笔记——基础篇

    Tips1:eclipse中会经常用到System.out.println方法,可以先输入syso,然后eclipse就会自动联想出这个语句了!! 学习笔记: *包.权限控制 1.包(package) ...

  6. Java学习笔记之:Java简介

    一.引言 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出. ...

  7. Java学习笔记之:Java String类

    一.引言 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串最简单的方式如下: String str= "Hello w ...

  8. Java学习笔记之:Java引用数据类型之字符串

    一.简介 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串最简单的方式如下: String greeting = "H ...

  9. Java 学习笔记 ------第一章 Java平台概论

    本章学习目标: Java版本迁移简介 认识Java SE.Java EE.Java ME 认识JDK规范与操作 了解JVM.JRE与JDK 下载与安装JDK 一.Java版本迁移简介 书上已经表达得非 ...

随机推荐

  1. 24 | 紧跟时代步伐:微服务模式下API测试要怎么做?

  2. cat more less 命令混用

    在Linux系统中有三种命令可以用来查阅全部的文件,分别是cat.more和less命令.它们查阅文件的使用方法也比较简单都是 命令 文件名 ,但是三者又有着区别. 1.cat命令可以一次显示整个文件 ...

  3. SQLServer常用运维SQL整理

    今天线上SQLServer数据库的CPU被打爆了,紧急情况下,分析了数据库阻塞.连接分布.最耗CPU的TOP10 SQL.查询SQL并行度配置.查询SQL 重编译的原因等等 整理了一些常用的SQL 1 ...

  4. java Https工具类

    import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import ja ...

  5. 从零开始一起学习SALM-ICP原理及应用

    点"计算机视觉life"关注,星标更快接收干货! ## 小白:师兄,最近忙什么呢,都见不到你人影,我们的课也好久没更新了呢 师兄:抱歉,抱歉,最近忙于俗事.我后面一起补上,学习劲头 ...

  6. elasticsearch 集群部署,版本 5.5.0

    准备说明: 两台服务器 Ip分别为 192.168.239.78(主),192.168.239.49(从) 主服务器上配置如下:1.上传es5.5.0版本至主服务器2.解压 unzipunzip el ...

  7. 学习 Python 心得

    脚本式编程: 通过脚本参数调用解释器开始执行脚本,直到脚本执行完毕.当脚本执行完成后,解释器不再有效. 让我们写一个简单的 Python 脚本程序.所有 Python 文件将以 .py 为扩展名.将以 ...

  8. Mllib数据类型(密集向量和稀疏向量)

    1.局部向量 Mllib支持2种局部向量类型:密集向量(dense)和稀疏向量(sparse). 密集向量由double类型的数组支持,而稀疏向量则由两个平行数组支持. example: 向量(5.2 ...

  9. [原创]SSH Tunnel for UDP

    SSH Tunnel for UDP UDP port forwarding is a bit more complicated. We will need to convert the packet ...

  10. Shiro认证时的密码比对

    在前面一节<Shiro在Web环境下集成Spring的大致工作流程>的最后一步中提到由Shiro完整密码比对. 那么具体是怎么工作的? 1,既然shiro会把密码来进行比对,当然会调用 U ...