一个好用的java图片缩放及质量压缩方法
本文中代码来自:http://blog.csdn.net/liuhuanchao/article/details/50527856
由于网站需要对上传的图片进行宽度判断缩放和质量压缩,以提升整体加载速度,于是我在网上找处理方法,
网上大多数是谷歌图片处理组件Thumbnails的介绍。最开始我用Thumbnails尝试,但不知道什么原因,没有任何效果,也不报错。
由于时间的关系,就没再深入研究,另寻他路。后来找到了下面的方法,这个方法优点在于完全基于Java自带API,调用也非常简单,如果只是缩放和压缩,这个方法足够了。
代码:
1 /**
2 * 缩放图片(压缩图片质量,改变图片尺寸)
3 * 若原图宽度小于新宽度,则宽度不变!
4 * @param newWidth 新的宽度
5 * @param quality 图片质量参数 0.7f 相当于70%质量
6 */
7 public static void imageResize(File originalFile, File resizedFile,
8 int maxWidth,int maxHeight, float quality) throws IOException {
9
10 if (quality > 1) {
11 throw new IllegalArgumentException(
12 "图片质量需设置在0.1-1范围");
13 }
14
15 ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
16 Image i = ii.getImage();
17 Image resizedImage = null;
18
19 int iWidth = i.getWidth(null);
20 int iHeight = i.getHeight(null);
21
22 int newWidth = maxWidth;
23 if(iWidth < maxWidth){
24 newWidth = iWidth;
25 }
26
27
28 if (iWidth >= iHeight) {
29 resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight)
30 / iWidth, Image.SCALE_SMOOTH);
31 }
32
33
34
35 int newHeight = maxHeight;
36 if(iHeight < maxHeight){
37 newHeight = iHeight;
38 }
39
40 if(resizedImage==null && iHeight >= iWidth){
41 resizedImage = i.getScaledInstance((newHeight * iWidth) / iHeight,
42 newHeight, Image.SCALE_SMOOTH);
43 }
44
45 // This code ensures that all the pixels in the image are loaded.
46 Image temp = new ImageIcon(resizedImage).getImage();
47
48 // Create the buffered image.
49 BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null),
50 temp.getHeight(null), BufferedImage.TYPE_INT_RGB);
51
52 // Copy image to buffered image.
53 Graphics g = bufferedImage.createGraphics();
54
55 // Clear background and paint the image.
56 g.setColor(Color.white);
57 g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
58 g.drawImage(temp, 0, 0, null);
59 g.dispose();
60
61 // Soften.
62 float softenFactor = 0.05f;
63 float[] softenArray = { 0, softenFactor, 0, softenFactor,
64 1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 };
65 Kernel kernel = new Kernel(3, 3, softenArray);
66 ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
67 bufferedImage = cOp.filter(bufferedImage, null);
68
69 // Write the jpeg to a file.
70 FileOutputStream out = new FileOutputStream(resizedFile);
71
72 // Encodes image as a JPEG data stream
73 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
74
75 JPEGEncodeParam param = encoder
76 .getDefaultJPEGEncodeParam(bufferedImage);
77
78 param.setQuality(quality, true);
79
80 encoder.setJPEGEncodeParam(param);
81 encoder.encode(bufferedImage);
82 } // Example usage
调用:
1 //图片压缩处理(缩放+质量压缩以减小高宽度及数据量大小)
2 imageResize(imgFile,imgFile,1200,3000,0.9f);//宽度大于1200的,缩放为1200,高度大于3000的缩放为3000,按比例缩放,质量压缩掉10%
推荐一个好用的聚合搜索引擎,https://www.tomfind.com/ ,支持谷歌、百度、搜狗、bing、360一键切换,支持网页、音乐、购物、视频搜索、支持抖音、快手、哔哩哔哩、微信、头条、知乎搜索、支持顶部栏、左侧栏两种界面模式。
一个好用的java图片缩放及质量压缩方法的更多相关文章
- java图片缩放
package com.rubekid.springmvc.utils; import java.awt.AlphaComposite; import java.awt.Graphics2D; imp ...
- java图片压缩工具类(指定压缩大小)
1:先导入依赖 <!--thumbnailator图片处理--> <dependency> <groupId>net.coobird</groupId> ...
- java图片缩放与裁剪
import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io ...
- java 图片缩放
使用java自带的图片处理api,也可以使用(GraphicsMagick + im4j) import java.awt.Image; import java.awt.image.BufferedI ...
- Asp.net 实现图片缩放 无水印(方法二)
public static System.Drawing.Image GetImage(string path) { try { if (path.StartsWith("http" ...
- php图片上传旋转压缩方法
用到php的exif扩展,需要开启exif 在php.ini文件中去掉exif组件的注释 extension=php_mbstring.dll //要放在php_exif.dll前面让它先加载 ext ...
- Java 图片处理——如何生成高清晰度而占有磁盘小的缩略图
现在的web项目,图片越来越多,图片大小也越来越大,随便就能达到1M,2M,甚至更大.用户上传的图片,一般是无法直接使用的.一般要生成两三种对应的缩略图,分别适配不同的终端,不同的场景.比如PC,手机 ...
- Android图片压缩方法总结
本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 第一:质量压缩方法: ? 1 2 3 ...
- android图片压缩方法
android 图片压缩方法: 第一:质量压缩法: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = ...
- Android应用开发中三种常见的图片压缩方法
Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap com ...
随机推荐
- Android Studio Dolphin 稳定版正式发布
作者 / Yuri Blaise, Product Manager, Android为了帮助开发者们更轻松地打造高质量应用,Android Studio 团队深入调研,为大家带来了最新稳定版 An ...
- Python学习笔记--判断语句的延续
if else语句 示例: 需要注意的是,if后面必须有条件,而else后面可以不需要判断条件 案例: 实现: if elif else 语句 多条件判断,if 和 elif 后面必须有条件,else ...
- Go语言:利用 TDD 测试驱动开发帮助理解数组与动态数组(切片)的区别
Array VS Slice 数组允许你以特定的顺序在变量中存储相同类型的多个元素. 对于数组来说,最常见的就是迭代数组中的元素. 我们创建一个 Sum 函数,它使用 for 来循环获取数组中的元素并 ...
- Java面试——消息队列
一.消息队列的使用场景 ☞ 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景.[1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信. 引入消息队列后 ...
- 创建镜像发布到镜像仓库【不依赖docker环境】
image 工具背景 如今,docker镜像常用于工具的分发,demo的演示,第一步就是得创建docker镜像.一般入门都会安装docker,然后用dockerFile来创建镜像,除此以外你还想过有更 ...
- 原型继承和 Class 继承
涉及面试题: 原型如何实现继承? Class 如何实现继承? Class 本质是什么? ⾸先先来讲下 class ,其实在 JS 中并不存在类, class 只是语法糖,本质还是函数. class P ...
- day3 函数的定义和调用,练习编写简单的程序(记录2)
一.值传递.指针传递.引用传递 值传递: 在值传递中,函数的形参是由实参的副本初始化的,也就是说,函数内部操作的是实参的一个拷贝.值传递适用于传递简单数据类型(如整数.浮点数.字符等)以及小型结构体等 ...
- SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具)
SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具) 搜到大部分打包exe的文章都是使用exe4j打包 步骤贼多,安装麻烦,打包麻烦 收费软件,公司使用会吃律师函 JDK14以上 ...
- ACM-学习记录-尺取法
题目 给定一个数组和一个数s,在这个数组中找一个区间,使得这个区间之和等于s. 例如:给定的数组int x[14] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...
- CentOS8 搭建Kubernetes
CentOS8 搭建Kubernetes 主机名 IP 组件 k8s-master 192.168.40.128/24 kubeadm.kubelet.kubectl.docker-ce k8s-no ...