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版本迁移简介 书上已经表达得非 ... 
随机推荐
- 长春理工大学第十四届程序设计竞赛(重现赛)B
			B Bowling Game 题目链接:https://ac.nowcoder.com/acm/contest/912/B 题目 CUST的队员打完省赛后,小r带着大家去打保龄球. 保龄球是一项难度非 ... 
- 👮 Golang Gin/Ace/Iris/Echo RBAC 鉴权库
			GRBAC 项目地址: https://github.com/storyicon/grbac Grbac是一个快速,优雅和简洁的RBAC框架.它支持增强的通配符并使用Radix树匹配HTTP请求.令人 ... 
- css实现超出文本溢出用省略号代替
			一.单行 实现单行文本的溢出显示省略号使用text-overflow:ellipsis属性,但需要配合使用另外两个属性使用才能达到效果. 如下: overflow:hidden; text-overf ... 
- MySQL数据库设计与开发规范
			目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ... 
- mysql复制那点事 - Seconds_behind_Master参数调查笔记
			目录 mysql复制那点事 - Seconds_behind_Master参数调查笔记 0. 参考文献 1. 问题背景 2. 调查结论 3. 调查与分析过程 3.1 轮转binlog时的运行逻辑 3. ... 
- NetCore AutoMapper的封装
			需要引用AutoMapper的Nuget包 如果需要忽略某个字段就在字段上面打标签如下: [IgnoreMap] public string IgnoreValue { get; set; } ... 
- java学习笔记(基础篇)—变量与表达式
			一:局部变量和实例变量 定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则. 作用域:指它的存在范围,只有在这个范围内,程序代码才能访问它. 变量的生 ... 
- ForkJoinPool分支/合并框架工程使用的工作窃取
			ForkJoinPool分支/合并框架 在必要的情况下,讲一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆为止),再将一个个小的任务运算的结果进行join汇总. 工作窃取的背景 分支/合并框 ... 
- [AOP拦截 ]SpringBoot+Quartz Aop拦截Job类中的方法
			 最近在工作使用boot+quartz整合,开发定时调度平台,遇到需要对Quartz的Job进行异常后将异常记录到日志表的操作,第一反应就想到了使用Spring的AOP,利用AfterThrowin ... 
- 哥们,B/S了解吗?——啥玩意,我是敲代码的
			了解B/S和C/S 前言:......“学好长时间编程了,JavaSE学完了,前端也简单学了”.....“那你学这么多,讲讲B/S吧”......“B/S?这是个啥玩意?没听过”......“靠,牛逼 ... 
