java学习笔记(中级篇)—java实现高质量图片压缩
使用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实现高质量图片压缩的更多相关文章
- java学习笔记(中级篇)—JDK动态代理
一.什么是代理模式 相信大家都知道代理商这个概念,在商业中,代理商无处不在.假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商.你要买或 ...
- java学习笔记(基础篇)--java关键字与数据类型
java关键字与数据类型 Java语言的关键字是程序代码中的特殊字符.包括: . 类和接口的声明--class, extends, implements, interface . 包引入和包声明--i ...
- java学习笔记(基础篇)—java数组
一:什么是数组,什么时候使用数组? 数组是用来保存一组数据类型相同的元素的有序集合,数组中的每个数据称为元素.有序集合可以按照顺序或者下标取数组中的元素. 在Java中,数组也是Java对象.数组中的 ...
- Java学习笔记心得——初识Java
初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开 ...
- Java学习笔记——基础篇
Tips1:eclipse中会经常用到System.out.println方法,可以先输入syso,然后eclipse就会自动联想出这个语句了!! 学习笔记: *包.权限控制 1.包(package) ...
- Java学习笔记之:Java简介
一.引言 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出. ...
- Java学习笔记之:Java String类
一.引言 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串最简单的方式如下: String str= "Hello w ...
- Java学习笔记之:Java引用数据类型之字符串
一.简介 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串最简单的方式如下: String greeting = "H ...
- Java 学习笔记 ------第一章 Java平台概论
本章学习目标: Java版本迁移简介 认识Java SE.Java EE.Java ME 认识JDK规范与操作 了解JVM.JRE与JDK 下载与安装JDK 一.Java版本迁移简介 书上已经表达得非 ...
随机推荐
- Codeforces Round #564 (Div. 2)B
B. Nauuo and Chess 题目链接:http://codeforces.com/contest/1173/problem/B 题目 Nauuo is a girl who loves pl ...
- 浅说——状压DP
第一次没认真听,没听懂.(有点难) 第二次才搞懂,主要位运算太烦了!!! 位运算基础知识: 名称 符号 规则 按位与 & 全一则一,否则为零 按位或 | 有一则一,否则为零 按位取反 ~ 是零 ...
- BZOJ 1483:[HNOI2009]梦幻布丁(链表启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=1483 题意:中文. 思路:对于每一种颜色,用一个链表串起来,一开始保存一个答案,后面颜色替换的时候再 ...
- 如何搭建一个vue项目(完整步骤)
参考资料 一.安装node环境 1.下载地址为:https://nodejs.org/en/ 2.检查是否安装成功:如果输出版本号,说明我们安装node环境成功 3.为了提高我们的效率,可以使用淘宝的 ...
- kindeditor在线文本编辑器过滤HTML的方法
在使用kindeditor文本编辑器时遇到的问题,客户直接从Excel里粘贴文本内容到文本编辑器中(能不能再懒一些),然后不调整粘贴内容直接就保存(你敢不敢再懒一些)!对于这种很无语的行径,我只能对他 ...
- WebLogic 任意文件上传远程代码执行_CVE-2018-2894漏洞复现
WebLogic 任意文件上传远程代码执行_CVE-2018-2894漏洞复现 一.漏洞描述 Weblogic管理端未授权的两个页面存在任意上传getshell漏洞,可直接获取权限.Oracle 7月 ...
- struts2入门Demo
一.引入必要的jar包,所需jar包如下: 二.配置web.xml.主要目的是拦截请求 <?xml version="1.0" encoding="UTF-8&qu ...
- [开源]OSharpNS 步步为营系列 - 3. 添加业务服务层
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- 企业如何从“API优先”的策略中获益
在过去的几年里,全球API经济在以难以置信的速度进行快速地增长.物联网.人工智能.自动驾驶等等众多令人充满期待的技术正蓬勃发展,这也证明了API对于如今整个技术圈子的重要性,也预示着在不久的将来它还将 ...
- yum只下载不安装软件包
一.通过yum自带的工具yumdownloader [root@host---- interpreter]# rpm -ql yum-utils package yum-utils is not in ...