package util;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
public class ImageCompressUtil {
/**
* 按宽度比例压缩图片
*
* @param sourceFile 源图片
* @param targetFile 目标图片
* @param width 压缩后的宽度
* @throws IOException
*/
public static void thumbnail(File sourceFile, File targetFile, int width) throws IOException {
FileOutputStream os = null;
try {
os = new FileOutputStream(targetFile);
thumbnail_w_h(sourceFile, width, 0, os);
} finally {
if (os != null) {
os.close();
}
}
}
/**
* 按照 宽高 比例压缩
*
* @param img
* @param width
* @param height
* @param out
* @throws IOException
*/
public static void thumbnail_w_h(File img, int width, int height, OutputStream out) throws IOException {
BufferedImage bi = ImageIO.read(img);
double srcWidth = bi.getWidth(); // 源图宽度
double srcHeight = bi.getHeight(); // 源图高度
double scale = 1;
if (width > 0) {
scale = width / srcWidth;
}
if (height > 0) {
scale = height / srcHeight;
}
if (width > 0 && height > 0) {
scale = height / srcHeight < width / srcWidth ? height / srcHeight : width / srcWidth;
}
thumbnail(img, (int) (srcWidth * scale), (int) (srcHeight * scale), out);
}
/**
* 按照固定宽高原图压缩
*
* @param img
* @param width
* @param height
* @param out
* @throws IOException
*/
public static void thumbnail(File img, int width, int height, OutputStream out) throws IOException {
BufferedImage BI = ImageIO.read(img);
Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.setColor(Color.RED);
g.drawImage(image, 0, 0, null); // 绘制处理后的图
g.dispose();
ImageIO.write(tag, "JPEG", out);
}
/**
* 按照宽高裁剪
*
* @param srcImageFile
* @param destWidth
* @param destHeight
* @param out
* @throws IOException
*/
public static void cut_w_h(File srcImageFile, int destWidth, int destHeight, OutputStream out) throws IOException {
cut_w_h(srcImageFile, 0, 0, destWidth, destHeight, out);
}
public static void cut_w_h(File srcImageFile, int x, int y, int destWidth, int destHeight, OutputStream out) throws IOException {
Image img;
ImageFilter cropFilter;
// 读取源图像
BufferedImage bi = ImageIO.read(srcImageFile);
int srcWidth = bi.getWidth(); // 源图宽度
int srcHeight = bi.getHeight(); // 源图高度
if (srcWidth >= destWidth && srcHeight >= destHeight) {
Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);
cropFilter = new CropImageFilter(x, y, destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
BufferedImage tag = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(img, 0, 0, null); // 绘制截取后的图
g.dispose();
// 输出为文件
ImageIO.write(tag, "JPEG", out);
}
}
public static void main(String[] args) throws IOException {
File img = new File("G:\\18917_en_1.jpg");
File to = new File("G:\\a.jpg");
thumbnail(img, to, 1000);
}
}