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图片缩放的更多相关文章

  1. java图片缩放与裁剪

    import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io ...

  2. java 图片缩放

    使用java自带的图片处理api,也可以使用(GraphicsMagick + im4j) import java.awt.Image; import java.awt.image.BufferedI ...

  3. Java图片工具类,完成图片的截取和任意缩放

    package com.common.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Renderin ...

  4. java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。

    java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...

  5. java 图片压缩 缩放

    废话不多说,直接上代码,静态方法可直接调用,中间用流来处理的 /** * 图片缩放(未考虑多种图片格式和等比例缩放) * @param filePath 图片路径 * @param height 高度 ...

  6. java 图片处理工具类

    import java.awt.Image;  import java.awt.Rectangle;  import java.awt.geom.AffineTransform;  import ja ...

  7. Java 图片转换为字符图 CharMaps (整理)

      /* * Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * * @(#)CharMaps.java 2014/1/16 * 1.这个一 ...

  8. java,图片压缩,略缩图

    在网上找了两个图片的缩放类,在这里分享一下: package manager.util; import java.util.Calendar; import java.io.File; import ...

  9. android关于图片缩放

    网上有许多关于图片缩放的demo,本人都感觉不怎么好用,最近在github看到了 一个简单的支持多指缩放图片的Android View类 gesture-imageview (地址:https://g ...

随机推荐

  1. php $_server 整理

    $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关. $_SERVER['argv'] #传递给该脚本的参数. $_SERVER['argc'] ...

  2. thinkphp ajax 实例 实现

    thinkPHP后台实现 #删除用户操作      function delete()      {        if(isset($_SERVER["HTTP_X_REQUESTED_W ...

  3. PHP分页详细讲解

    网上有好多PHP分页的类,但我们要弄明白PHP分页原理才可以学到知识,今天我就带你学制作PHP分页.     1.前言分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之 ...

  4. window.open()提交POST数据

    window.open(URL,name,specs,replace)   > Details 我们一般都是通过window.open(url, name, specs)以GET方式让浏览器打开 ...

  5. 优雅降级&渐进增强

    优雅降级(Graceful Degradation) 关注点:最新的浏览器上构建体验很好的WEB应用. 降级:旧版本浏览器提供差强人意的体验,不影响功能的使用. 渐进增强(Progressive En ...

  6. 基于jsp+servlet图书管理系统之后台用户信息修改操作

    上一篇的博客写的是查询操作,且附有源码和数据库,这篇博客写的是修改操作,附有从头至尾写的代码(详细的注释)和数据库! 此次修改操作的源码和数据库:http://download.csdn.net/de ...

  7. JS简易时钟

    HTML <div id="clock"> <span></span>:<span></span>:<span&g ...

  8. USB方向

    Because the host is always the bus master, it is easy to remember USB direction: OUT means from the ...

  9. mysqldump 一些参数体验

    mysqldump -uroot -p'xxx' -R --single-transaction --master-data=2 zjzc>$TODAY_DIR/zjzc/zjzc_${TODA ...

  10. Hadoop FileInputFormat实现原理及源码分析

    FileInputFormat(org.apache.hadoop.mapreduce.lib.input.FileInputFormat)是专门针对文件类型的数据源而设计的,也是一个抽象类,它提供两 ...