ImageIO的图片压缩算法
调用CompressPictureUtils.compress(要压缩的图片路径,保存的图片路径)可以对图片进行压缩。
左边的原图,右边是压缩后的图片。
调用函数的方法:
public static void main(String[] args) {CompressPictureUtils.compress("D:\\1.jpg", "D:\\0.jpg");}
可以设置压缩属性:
/*** 图片压缩最大宽1920像素*/public static final Integer PICTURE_COMPRESS_WIDTH_MAX = 1920;// 1920像素/*** 图片压缩最大高1920像素*/public static final Integer PICTURE_COMPRESS_HEIGHT_MAX = 1920;// 1920像素/*** 图片压缩最小容量64KB*/public static final Integer PICTURE_COMPRESS_MIN = 1 << 16;// 64KB/*** 图片压缩最大容量64MB*/public static final Integer PICTURE_COMPRESS_MAX = 1 << 26;// 64MB/*** 图片压缩最小容量差64KB*/public static final Integer PICTURE_COMPRESS_DIFFER_MIN = 1 << 16;// 64KB
工具类:(复制后可以直接使用)
package util;import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Files;import javax.imageio.ImageIO;/*** 图片压缩算法* * @author ALI**/
public class CompressPictureUtils {public static void main(String[] args) {CompressPictureUtils.compress("D:\\1.jpg", "D:\\0.jpg");}/*** 图片压缩最大宽1920像素*/public static final Integer PICTURE_COMPRESS_WIDTH_MAX = 1920;// 1920像素/*** 图片压缩最大高1920像素*/public static final Integer PICTURE_COMPRESS_HEIGHT_MAX = 1920;// 1920像素/*** 图片压缩最小容量64KB*/public static final Integer PICTURE_COMPRESS_MIN = 1 << 16;// 64KB/*** 图片压缩最大容量64MB*/public static final Integer PICTURE_COMPRESS_MAX = 1 << 26;// 64MB/*** 图片压缩最小容量差64KB*/public static final Integer PICTURE_COMPRESS_DIFFER_MIN = 1 << 16;// 64KBpublic static void compress(String sourceImagePath, String destinationImagePath) {try {/* 过滤小于64kb和大于64mb的图片 */File sourceImageFile = new File(sourceImagePath);File destinationImageFile = new File(destinationImagePath);long sourceImageSize = sourceImageFile.length();if (sourceImageSize == 0) {throw new Exception("empty");}if (sourceImageSize < PICTURE_COMPRESS_MIN) {throw new Exception("small");}if (sourceImageSize > PICTURE_COMPRESS_MAX) {throw new Exception("large");}/* 设置图片大小 */BufferedImage inputImage = ImageIO.read(sourceImageFile);int sourceImageWidth = inputImage.getWidth();int sourceImageHeight = inputImage.getHeight();int destinationImageWidth = sourceImageWidth;int destinationImageHeight = sourceImageHeight;if (sourceImageWidth > PICTURE_COMPRESS_WIDTH_MAX || sourceImageHeight > PICTURE_COMPRESS_HEIGHT_MAX) {if (sourceImageWidth > sourceImageHeight) {destinationImageWidth = PICTURE_COMPRESS_WIDTH_MAX;destinationImageHeight = destinationImageWidth * sourceImageHeight / sourceImageWidth;} else {destinationImageHeight = PICTURE_COMPRESS_HEIGHT_MAX;destinationImageWidth = destinationImageHeight * sourceImageWidth / sourceImageHeight;}}/* 压缩图片 */Image image = inputImage.getScaledInstance(destinationImageWidth, destinationImageHeight,Image.SCALE_DEFAULT);BufferedImage outputImage = new BufferedImage(destinationImageWidth, destinationImageHeight,BufferedImage.TYPE_INT_RGB);Graphics graphics = outputImage.getGraphics();graphics.drawImage(image, 0, 0, null);graphics.dispose();ImageIO.write(outputImage, "jpg", destinationImageFile);/* 过滤比原图小8kb以下的的图片 */long destinationImageSize = destinationImageFile.length();if (destinationImageSize > (sourceImageSize - PICTURE_COMPRESS_DIFFER_MIN)) {throw new Exception("low");}} catch (Exception e) {try {String msg = e.getMessage();if (msg == "small" || msg == "low") {// 过小或压缩率过低,保存原图File sourceImageFile = new File(sourceImagePath);File destinationImageFile = new File(destinationImagePath);destinationImageFile.delete();Files.copy(sourceImageFile.toPath(), destinationImageFile.toPath());} else {// 空或过大或异常,保存空图File emptyfile = new File(destinationImagePath);emptyfile.delete();emptyfile.createNewFile();}} catch (Exception e1) {}}}
}
ImageIO的图片压缩算法相关推荐
- 简单的BMCP位图图片压缩算法
此算法并不高深,各位专业人士可以飘过了Orz.并且如果各位知道一些图片格式与压缩算法的话,从中应该可以看到一些相似的"影子". PS:本人非专业人士,以下有说错的敬请各位谅解:) ...
- 深度学习为图片压缩算法赋能:节省55%带宽
本文来自图鸭科技团队的投稿,他们用深度学习技术设计.优化图片压缩算法,在保证图像画质的情况下能节省55%带宽.本文将介绍实现方法及测试对比. 随着互联网的发展,人们对高清图片的需求也在不断增加,在保证 ...
- C#:实现大图片压缩算法(附完整源码)
C#:实现大图片压缩算法 private void button3_Click(object sender, EventArgs e){using (OpenFileDialog ofd = new ...
- 高质量无损图片压缩算法
高质量无损图片压缩算法 using System.Drawing; using System.Drawing.Imaging; using System.IO;namespace CompressIm ...
- 这可能是最接近微信朋友圈的图片压缩算法
开源最前线(ID:OpenSourceTop) 猿妹 整编 综合自:https://github.com/Curzibn/Luban 目前做APP开发总绕不开图片元素,如今手机拍照分辨率都非常高,图片 ...
- C#:实现图片压缩算法(附完整源码)
C#:实现图片压缩算法 public static bool GetPicThumbnail(string sFile, string outPath, int flag){System.Drawin ...
- ImageIO 读取图片
ImageIO提供了直接读取图片到内存的方式,同样,我们可以使用ImageReader读取文件到内存中进行使用:我们对两种方式进行介绍. ImageReader读取 // 创建随机访问文件对象 Ran ...
- java ImageIO.write图片上传变色及背景变黑解决
java ImageIO.write图片上传变色及背景变黑解决 public void getImage(HttpServletRequest request, HttpServletResponse ...
- Luban(鲁班)——可能是最接近微信朋友圈的图片压缩算法
Luban Luban(鲁班)--Android图片压缩工具,仿微信朋友圈压缩策略 项目描述 目前做app开发总绕不开图片这个元素.但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题.单纯对 ...
最新文章
- 在SpringBoot启动类上添加ComponentScan出现springbootapplication already applies given @ComponentScan
- 《2021人脸识别行业白皮书》发布 拥挤安防还有多少空间?
- webapi返回字符串,解决自动加双引号或下划线的问题
- ElementUI table的行高设置
- 移动磁盘显示由于IO设备错误,无法运行此项请求要怎样寻回资料
- 机器学习概念笔记(1)——混淆矩阵、Precision、Recall、F-score
- 非常好用的自助建站程序整站源码 内置几十种站
- 液压传动与气动技术【3】
- ArcGIS实验教程——实验三十:地图注记与标注(标注转注记)用法案例详解
- Android 快速索引(城市列表和联系人)
- WIN7 通知栏处喇叭上有个小红叉,提示未插入“未插入扬声器或耳机”的解决方法
- vue里面watch监听当前路由信息
- iphone数据线连不上Mac
- MAC visio的替代品Omnigraffle+激活许可证
- linux命令---top
- URP——着色器和材质——灯光着色器 Lit
- phpyun joblist标签动态参数使用方法
- 量化投资学习——无套利均衡定价理论(non-arbitrage pricing theory)
- 沃顿商学院自我管理课
- 小技巧:怎么开通注册个人邮箱?