上次发了一个工具类,可以针对一般的图片进行处理,算是个微型版,比较实用,这个是完整版,可以处理gif动态图片
java图片处理工具类:
package com.pinker.util;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
/**
* 图像裁剪以及压缩处理工具类
*
* 主要针对动态的GIF格式图片裁剪之后,只出现一帧动态效果的现象提供解决方案
*
* 提供依赖三方包解决方案(针对GIF格式数据特征一一解析,进行编码解码操作)
* 提供基于JDK Image I/O 的解决方案(JDK探索失败)
*/
public class ImageUtil2 {
public enum IMAGE_FORMAT{
BMP("bmp"),
JPG("jpg"),
WBMP("wbmp"),
JPEG("jpeg"),
PNG("png"),
GIF("gif");
private String value;
IMAGE_FORMAT(String value){
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
/**
* 获取图片格式
* @param file 图片文件
* @return 图片格式
*/
public static String getImageFormatName(File file)throws IOException{
String formatName = null;
ImageInputStream iis = ImageIO.createImageInputStream(file);
Iterator<ImageReader> imageReader = ImageIO.getImageReaders(iis);
if(imageReader.hasNext()){
ImageReader reader = imageReader.next();
formatName = reader.getFormatName();
}
return formatName;
}
/************************* 基于三方包解决方案 *****************************/
/**
* 剪切图片
*
* @param source 待剪切图片路径
* @param targetPath 裁剪后保存路径(默认为源路径)
* @param x 起始横坐标
* @param y 起始纵坐标
* @param width 剪切宽度
* @param height 剪切高度
*
* @returns 裁剪后保存路径(图片后缀根据图片本身类型生成)
* @throws IOException
*/
public static String cutImage(String sourcePath , String targetPath , int x , int y , int width , int height) throws IOException{
File file = new File(sourcePath);
if(!file.exists()) {
throw new IOException("not found the image:" + sourcePath);
}
if(null == targetPath || targetPath.isEmpty()) targetPath = sourcePath;
String formatName = getImageFormatName(file);
if(null == formatName) return targetPath;
formatName = formatName.toLowerCase();
// 防止图片后缀与图片本身类型不一致的情况
String pathPrefix = getPathWithoutSuffix(targetPath);
targetPath = pathPrefix + formatName;
// GIF需要特殊处理
if(IMAGE_FORMAT.GIF.getValue() == formatName){
GifDecoder decoder = new GifDecoder();
int status = decoder.read(sourcePath);
if (status != GifDecoder.STATUS_OK) {
throw new IOException("read image " + sourcePath + " error!");
}
AnimatedGifEncoder encoder = new AnimatedGifEncoder();
encoder.start(targetPath);
encoder.setRepeat(decoder.getLoopCount());
for (int i = 0;