java图片缩放
package com.rubekid.springmvc.utils; import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collection; import javax.imageio.ImageIO; import net.sf.jmimemagic.MagicException;
import net.sf.jmimemagic.MagicMatchNotFoundException;
import net.sf.jmimemagic.MagicParseException; import org.apache.commons.io.FileUtils;
import org.summercool.image.AnimatedGifEncoder;
import org.summercool.image.GifDecoder;
import org.summercool.image.Scalr;
import org.summercool.image.Scalr.Method;
import org.summercool.image.Scalr.Mode; import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder; import eu.medsea.mimeutil.MimeUtil; /**
* 图片压缩处理
* @author Rubekid
*
*/
public class ImageScale { public static final String TYPE_JPEG = "jpg"; public static final String TYPE_PNG = "png"; public static final String TYPE_GIF = "gif"; public static final String TYPE_BMP = "bmp"; /**
* 图片缩放
* @param srcFile
* @param destFile
* @param maxWidth
* @param maxHeight
* @param type
* @param quality
* @throws IOException
*/
public static void resize(File srcFile, File destFile, int maxWidth, int maxHeight, String type, float quality) throws IOException{
if(TYPE_GIF.equals(type)){
resizeGif(srcFile, destFile, maxWidth, maxHeight);
}
else if(TYPE_PNG.equals(type)){
resizePng(srcFile, destFile, maxWidth, maxHeight);
}
else{
resizeJpeg(srcFile, destFile, maxWidth, maxHeight, quality);
}
} /**
* 图片缩放
* @param srcFile
* @param destFile
* @param maxWidth
* @param maxHeight
* @param type
* @throws IOException
*/
public static void resize(File srcFile, File destFile, int maxWidth, int maxHeight, String type) throws IOException{
resize(srcFile, destFile, maxWidth, maxHeight, type, 0.8f);
} /**
* 图片缩放
* @param srcFile
* @param destFile
* @param maxWidth
* @param maxHeight
* @throws Exception
*/
public static void resize(File srcFile, File destFile, int maxWidth, int maxHeight, float quality) throws Exception{
resize(srcFile, destFile, maxWidth, maxHeight, getType(srcFile), quality);
} /**
* 图片缩放
* @param srcFile
* @param destFile
* @param maxWidth
* @param maxHeight
* @throws Exception
*/
public static void resize(File srcFile, File destFile, int maxWidth, int maxHeight) throws Exception{
resize(srcFile, destFile, maxWidth, maxHeight, getType(srcFile));
} /**
* JPEG图片缩放
* @param srcFile
* @param destFile
* @param maxWidth
* @param maxHeight
* @throws IOException
* @throws ImageFormatException
*/
public static void resizeJpeg(File srcFile, File destFile, int maxWidth, int maxHeight, float quality) throws IOException{
BufferedImage image = ImageIO.read(srcFile); double scale = 0.8f;
AffineTransform atf = AffineTransform.getTranslateInstance(scale, scale); //AffineTransformOp affineTransformOp = new AffineTransformOp(xform, interpolationType) double rate = getResizeRate(srcFile, maxWidth, maxHeight);
int width = (int)(image.getWidth() * rate);
int height =(int) (image.getHeight() * rate);
image = Scalr.resize(image, Method.AUTOMATIC, Mode.AUTOMATIC, width, height);
BufferedImage bufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufferedImage.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1));
g.fillRect(0, 0, image.getWidth(), image.getHeight());
g.drawImage(image, 0, 0, null);
image = bufferedImage; FileOutputStream out = new FileOutputStream(destFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(quality, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(image);
} /**
* PNG图片缩放
* @param srcFile
* @param destFile
* @param maxWidth
* @param maxHeight
* @throws IOException
*/
public static void resizePng(File srcFile, File destFile, int maxWidth, int maxHeight) throws IOException{
BufferedImage bufferedImage = ImageIO.read(srcFile);
double rate = getResizeRate(srcFile, maxWidth, maxHeight);
if(rate == 1){
FileUtils.copyFile(srcFile, destFile);
}
else{
int width = (int)(bufferedImage.getWidth() * rate);
int height =(int) (bufferedImage.getHeight() * rate);
BufferedImage result = Scalr.resize(bufferedImage,Method.AUTOMATIC, Mode.AUTOMATIC, width, height);
ImageIO.write(result, "png", destFile);
}
} /**
* GIF图片缩放
* @param srcFile
* @param destFile
* @param maxWidth
* @param maxHeight
* @throws IOException
*/
public static void resizeGif(File srcFile, File destFile, int maxWidth, int maxHeight) throws IOException{
GifDecoder gd = new GifDecoder();
int status = gd.read(new FileInputStream(srcFile));
if (status != GifDecoder.STATUS_OK) {
return;
}
double rate = getResizeRate(srcFile, maxWidth, maxHeight);
if(rate == 1){
FileUtils.copyFile(srcFile, destFile);
}
else{
AnimatedGifEncoder ge = new AnimatedGifEncoder();
ge.start(new FileOutputStream(destFile));
ge.setRepeat(0);
for (int i = 0; i < gd.getFrameCount(); i++) {
BufferedImage frame = gd.getFrame(i);
int width = frame.getWidth();
int height = frame.getHeight();
width = (int) (width * rate);
height = (int) (height * rate); BufferedImage rescaled = Scalr.resize(frame, Mode.FIT_EXACT, width, height);
int delay = gd.getDelay(i);
ge.setDelay(delay);
ge.addFrame(rescaled);
}
ge.finish();
}
} /**
* 获取缩放比例
* @param srcFile
* @param MaxWidth
* @param MaxHeight
* @return
* @throws IOException
*/
public static double getResizeRate( File srcFile, int maxWidth, int maxHeight) throws IOException{
double rate = 1;
if(maxWidth==0 && maxHeight == 0){
return rate;
}
BufferedImage bImage = ImageIO.read(srcFile);
int width = bImage.getWidth();
int height = bImage.getHeight();
if(maxWidth == 0 && height > maxHeight){
rate = (double)maxHeight / height;
}
else if(maxHeight == 0 && width > maxWidth){
rate = (double)maxWidth / width;
}
else if((width > maxWidth || height > maxHeight) && maxWidth > 0 && maxHeight > 0){
rate = (double)maxWidth / width > (double)maxHeight / height ? (double)maxHeight / height : (double)maxWidth / width ;
}
if(rate > 1){
rate = 1;
}
return rate;
}
/**
*
* @param file
* @return
* @Exception
*/
public static String getMimeType(File file) throws Exception{
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);
return mimeTypes.toString();
} /**
* 获取图片类型(后缀)
* @param file
* @return
* @throws MagicException
* @throws MagicMatchNotFoundException
* @throws MagicParseException
*/
public static String getType(File file) throws Exception{
String mimeType = getMimeType(file);
return getType(mimeType);
} /**
* 获取图片类型(后缀)
* @param mimeType
* @return
*/
public static String getType(String mimeType){
if("image/gif".equals(mimeType)){
return TYPE_GIF;
}
else if("image/png".equals(mimeType) || "image/x-png".equals(mimeType)){
return TYPE_PNG;
}
else if("image/bmp".equals(mimeType) || "image/x-ms-bmp".equals(mimeType)){
return TYPE_BMP;
}
return TYPE_JPEG;
}
}
<dependency>
<groupId>com.mortennobel</groupId>
<artifactId>java-image-scaling</artifactId>
<version>0.8.5</version>
</dependency> <dependency>
<groupId>eu.medsea.mimeutil</groupId>
<artifactId>mime-util</artifactId>
<version>2.1.3</version>
</dependency> <dependency>
<groupId>jmimemagic</groupId>
<artifactId>jmimemagic</artifactId>
<version>0.1.2</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>simpleimage</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
java图片缩放的更多相关文章
- 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 ...
- Java图片工具类,完成图片的截取和任意缩放
package com.common.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Renderin ...
- java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
- java 图片压缩 缩放
废话不多说,直接上代码,静态方法可直接调用,中间用流来处理的 /** * 图片缩放(未考虑多种图片格式和等比例缩放) * @param filePath 图片路径 * @param height 高度 ...
- java 图片处理工具类
import java.awt.Image; import java.awt.Rectangle; import java.awt.geom.AffineTransform; import ja ...
- Java 图片转换为字符图 CharMaps (整理)
/* * Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * * @(#)CharMaps.java 2014/1/16 * 1.这个一 ...
- java,图片压缩,略缩图
在网上找了两个图片的缩放类,在这里分享一下: package manager.util; import java.util.Calendar; import java.io.File; import ...
- android关于图片缩放
网上有许多关于图片缩放的demo,本人都感觉不怎么好用,最近在github看到了 一个简单的支持多指缩放图片的Android View类 gesture-imageview (地址:https://g ...
随机推荐
- 请给出异步加载js方案
请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...
- Android之Activity生命周期简介
概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合 ...
- Github 上利用github pages 部署站点
一:起始 准备项目,如果你在github上已有项目,则无需新建,如果你要新起一个项目,则需先在github上创建一个项目 本文以已创建好的 github/TestGitPage 为例. 二:设置gi ...
- jQuery的live绑定事件在mobile safari(iphone / ipad / ipod)上失效的解决方案
jQuery的live绑定为什么会在mobile safari上失效呢?其实可以追溯到jQuery里live的实现方式.live的实现方式实际上是通过事件委托机制来实现的,也就是说是通过诸如冒泡的方式 ...
- Heapsort 堆排序算法详解(Java实现)
Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择 ...
- KEIL C51之绝对地址定位
单片机空间分配看*.M51文件,ARM,DSP空间分配看*.map文件 1.函数定位 假如要把C源文件 tools.c 中的函数 int BIN2HEX(int xx) { ... } 放在CODE ...
- 14.4.4 Redo Log Buffer
14.4.4 Redo Log Buffer redo log buffer 是内存区域持有数据被写入到redo log. Redo log buffer size 是通过 innodb_log_bu ...
- Clone Graph——LeetCode
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- http://blog.163.com/db_teacher/blog/static/194540298201110723712407/
实验(七).第五章 数据库完整性 2011-11-07 14:37:12| 分类: 默认分类 | 标签: |字号大中小 订阅 一.实验目的 1.熟悉通过SQL语句对数据进行完整性控制 2. ...
- mapreduce框架详解【转载】
[本文转载自:http://www.cnblogs.com/sharpxiajun/p/3151395.html] 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoo ...