使用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. java虚拟机-GC-新生代的GC、老年代的GC

    名词解释: GC:垃圾收集器 Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非 ...

  2. spark入门(三)键值对操作

    1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...

  3. AD域和LDAP协议

    随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下! 先简单的讲讲AD域 ...

  4. Oracle数据库----查询

    --笛卡尔集select empno,ename, 员工表.deptno, 部门表.deptno, dname from 部门表, 员工表; --添加合适的条件,可以避免笛卡尔集,从而得到正确的多表查 ...

  5. [HNOI2011]数学作业 题解

    这道题看着挺难然而其实看破了也挺容易的.首先N极其的大,几乎要炸掉long long ,所以O(n)的算法一定是扑街了,身为一个脑残志坚的OIer,怎能不想到矩阵快速幂优化呢? 有趣的是这道题矩阵有很 ...

  6. C语言指针学多了,你为什么会觉得晕?

    对于C语言中的指针概念,如果我告诉你,它是一个地址变量,你听了一头雾水,"地址?啥意思?"见你不理解,我说的详细点"指针变量跟其他变量一样,存储的是一个地址". ...

  7. 提升布局性能____Making ListView Scrolling Smooth

    listview是一个比较重要的UI组件,一切影响UI的操作,比如适配器从磁盘.网络或者数据库中加载数据的操作,最好都放在子线程中完成.子线程可以使用thread,不过那样比较老土,官方推荐使用Asy ...

  8. Worker-Thread设计模式

    import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent. ...

  9. 数据库系统概念:基础的SQL

    public class DataBase { public static void main() { } } /* 3.1 SQL查询语言概览 SQL语言有一下几个部分: 数据定义语言:提供定义关系 ...

  10. 实验吧--web--天下武功唯快不破

    ---恢复内容开始--- 英文翻译过来嘛,就是:天下武功无快不破嘛.(出题者还是挺切题的) 看看前端源码: 注意这里 please post what you find with parameter: ...