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 ...
随机推荐
- jquery easy ui 学习 (1)Basic Window
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [Apio2014]回文串
http://www.lydsy.com:808/JudgeOnline/problem.php?id=3676 这是一道回文树裸题,具体如何建图见http://blog.csdn.net/u0133 ...
- python之路——爬虫实例
urlController.py import bsController from urllib import request class SpiderMain(object): def __init ...
- JS 输出与变量
1. JS的输出 innerHTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- CentOS下安装配置Cacti
cacti简介 随着公司规模扩大,服务器也日渐增多,对服务器集群的网络流量和服务器性能实时监测显得愈发重要.开源阵营中常用有MRTG(MultiRouter Traffic Grapher)--基于S ...
- Netbeans8下 Weblogic EJB案例
1:接口 @Remote public interface XgmZzsNssb {} 2:实现 @Stateless(mappedName="XgmZzsNssbImpl") @ ...
- LED驅動芯片最大特點
最大特點是: 1.電源電壓在很寬的範圍內工作時,(約180V-265V)能保證 LED的恒功率輸出,並且 LED可實現無頻閃輸出. 2.實現安全隔離的安全電壓輸出,甚至是安全超低電壓輸出. 3.IC2 ...
- Couchbase 上手nosql for .net
由于项目需要,准备上手nosql数据库,比对了一番之后终于决定使用 couchbase.好了开始吧: 安装 地址:http://www.couchbase.com/get-started-develo ...
- bzoj3575[Hnoi2014]道路堵塞
http://www.lydsy.com/JudgeOnline/problem.php?id=3575 总赶脚第二题总是比第三题难...... 好吧,这题一点思路都没有 听说用民科可以过掉大部分数据 ...
- js到记时代码
原文地址:http://www.w3school.com.cn/tiy/t.asp?f=hdom_timing_infinite html><head><script type ...