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. phalcon安装和输出 hello word

    1:下载和安装Wampserver2.4-x86.exe 服务器: 2:到phalcon官方网站下载对应的dll文件 phalcon_x86_VC9_php5.4.0_1.2.5 我下的是这个版本 所 ...

  2. eclipse 编辑 python 中文乱码的解决方案

    今天在学习python时做了一个用户输入一个目录地址,再输入内容,然后将输入的内容存入输入的目录文件中: 具体代码如下: #coding:utf- ''' Created on -- @author: ...

  3. 查询一周最近一周的数据,date String 随意转换,更有疯狂的排序

    --查看一周随访的详情70007PROCEDURE GET_PATIENT_WEEKFU ( userId in NUMERIC, time in date, V_LIST OUT MYCURSOR ...

  4. Solr In Action 笔记(3) 之 SolrCloud基础

    Solr In Action 笔记(3) 之 SolrCloud基础 在Solr中,一个索引的实例称之为Core,而在SolrCloud中,一个索引的实例称之为Shard:Shard 又分为leade ...

  5. centos7 jsoup java.net.UnknownHostException

    [root@localhost ~]# vi /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loc ...

  6. PKUSC2016滚粗记

    Day0 坐飞机来北京,地铁上接到电话,以为是诈骗电话马上就挂了,然后看了一下是北京的电话,赶脚有点不对...打回去居然是报到处老师的电话..走了几个小时,到勺园和其他学校的神犇合住.TAT,感觉第二 ...

  7. 将excel里面的数据导入到程序里面

    页面布局 <table> <tr> <td style="padding-top: 16px; padding-left: 36px;"> &l ...

  8. C#可以直接调用的Win32API(和VCL做的整理工作非常类似)

    以前整理的Win32 API,可以直接在C#中直接调用,在做WinForm时还是很有帮助的.以前用在一个多窗口界面中,当轮询窗口时,调用API会提高很多效率. 源码下载 http://files.cn ...

  9. 生产环境下,不建议用早期版本的Mono........

    一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来

  10. 【HDOJ】3732 Ahui Writes Word

    初看01背包,果断TLE.是因为n和C都比较大.但是vi和ci却很小,转化为多重背包. #include <cstdio> #include <cstring> ][]; ]; ...