核心来自网络,自己添加了几个工具方法~
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.io.IOException;
import java.io.FileOutputStream;
import java.util.Map;
public class ResizeImage {
private static int defMinWidth=256;
private static int defMinHeight=196;
/**
* java自带的重写图片方法
* @param im 画布
* @param formatName 图片类型
* @param output 输出的文件流
* @return
*/
public boolean writeImage(BufferedImage im, String formatName, FileOutputStream output) {
try {
ImageIO.write(im, formatName, output);
im.flush();
return true;
} catch (IOException e) {
return false;
}
}
/**
* 生成图片到指定路径下,图片名称自动生成
* @param im BufferedImage
* @param fileFullPath 存放路径
* @return
*/
public boolean writeImage(BufferedImage im, String fileFullPath) {
try {
/*输出到文件流*/
FileOutputStream newimage = new FileOutputStream(fileFullPath+System.currentTimeMillis()+".jpg");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(im);
/* 压缩质量 */
// 改变此处参数,生成图片的质量改变
jep.setQuality(1f, true);
encoder.encode(im, jep);
/*近JPEG编码*/
newimage.close();
return true;
} catch (Exception e) {
return false;
}
}
/**
* 生成图片到指定路径下,图片名称指定
* @param im BufferedImage
* @param fileFullPath 存放路径
* @param fileName 要生成的图片名称
* @return
*/
public boolean writeImage(BufferedImage im, String fileFullPath, String fileName) {
try {
/*输出到文件流*/
FileOutputStream newimage = new FileOutputStream(fileFullPath+fileName);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(im);
/* 压缩质量 */
jep.setQuality(1f, true);
encoder.encode(im, jep);
/*近JPEG编码*/
newimage.close();
return true;
} catch (Exception e) {
return false;
}
}
/**
* 按比例缩小
* @param im 原始图像
* @param resizeTimes 倍数,比如0.5就是缩小一半, 缩小2倍为原来的1/2
* @return BufferedImage 返回处理后的图像
*/
public BufferedImage resizeImage(BufferedImage im, float resizeTimes) {
/*原始图像的宽度和高度*/
int width = im.getWidth();
int height = im.getHeight();
// 调整后的图片的宽度和高度
int toWidth;
int toHeight;
if(resizeTimes > 1){
toWidth = (int) (Float.parseFloat(String.valueOf(width)) / resizeTimes);
toHeight = (int) (Float.parseFloat(String.valueOf(height)) / resizeTimes);
} else {
toWidth = (int) (Float.parseFloat(String.valueOf(width)) * resizeTimes);
toHeight = (int) (Float.parseFloat(String.valueOf(height)) * resizeTimes);
}
/*新生成结果图片*/
BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
result.getGraphics().drawImage(im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);
return result;
}
/**
* 按最大宽度或最大高度缩放
* 按高度缩放到标准时,得到的宽度如果大于标准宽度,则按标准宽度
* @param im BufferedImage
* @param width 缩放后的最大宽度
* @param height 缩放后的最大高度
* @return
*/
public BufferedImage resizeImage(BufferedImage im, int width, int height) {
/*原始图像的宽度和高度*/
int width1 = im.getWidth();
int height1 = im.getHeight();
/*调整后的图片的宽度和高度*/
int toWidth = width;
int toHeight = height;
/* 按高度缩放到标准时,得到的宽度如果大于标准宽度,则按标准宽度 */
if(height*width1/height1 > width){
toWidth = width;
toHeight = height1*width/width1;
} else {
toHeight = height;
toWidth = width1*height/height1;
}
/*新生成结果图片*/
BufferedImage result = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
result.getGraphics().drawImage(im.getScaledInstance(toWidth, toHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);
return result;
}
/**
* 获取指定路径下的指定类型的所有图片
* @param path 指定的路径
* @param type 允许的图片类型数组
* @return List<BufferedImage> BufferedImage 画布集合 供调用
* @throws IOException
*/
public List<BufferedImage> getImageList(String path, String[] type) throws IOException{
Map<String,Boolean> map = new HashMap<String, Boolean>();
for(String s : type) {
map.put(s,true);
}
List<BufferedImage> result = new ArrayList<BufferedImage>();
File[] fileList = new File(path).listFiles();
for (File f : fileList) {
if(f.length() == 0)
continue;
if(map.get(getExtension(f.getName())) == null)
continue;
result.add(javax.imageio.ImageIO.read(f));
}
return result;
}
/**
* 返回文件的后缀名
* @param fileName
* @return
*/
public String getExtension(String fileName) {
try {
return fileName.split("\\.")[fileName.split("\\.").length - 1];
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) throws Exception{
// 源文件文件夹路径
String inputFoler = "c:\\cameraImage" ;
// 输出文件文件夹路径
String outputFolder = "c:\\output\\";
// 图片缩放倍数
float times = 2.3f;
ResizeImage r = new ResizeImage();
List<BufferedImage> imageList = r.getImageList(inputFoler,new String[] {"jpeg"});
for(BufferedImage i : imageList) {
r.writeImage(r.resizeImage(i,times),outputFolder);
}
// List<BufferedImage> imageList = r.getImageList(inputFoler,new String[] {"jpeg", "jpg"});
// for(BufferedImage i : imageList) {
// r.writeImage(r.resizeImage(i, defMinWidth, defMinHeight),outputFolder);
// }
// String srcFile = inputFoler+"\\1.jpeg";
// BufferedImage bufferImage = javax.imageio.ImageIO.read(new File(srcFile));
// r.writeImage(r.resizeImage(bufferImage, 402, 298), outputFolder);
}
}