- import java.awt.Graphics;
- import java.awt.GraphicsConfiguration;
- import java.awt.GraphicsDevice;
- import java.awt.GraphicsEnvironment;
- import java.awt.HeadlessException;
- import java.awt.Image;
- import java.awt.Rectangle;
- import java.awt.Transparency;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.Random;
- import javax.imageio.ImageIO;
- import javax.imageio.ImageReadParam;
- import javax.imageio.ImageReader;
- import javax.imageio.stream.ImageInputStream;
- import javax.swing.ImageIcon;
- import com.sun.image.codec.jpeg.JPEGCodec;
- import com.sun.image.codec.jpeg.JPEGImageEncoder;
- /**
- * @作者 王建明
- * @创建日期 2012-6-16
- * @创建时间 下午02:35:31
- * @版本号 V 1.0
- */
- public class IconCompressUtil {
- public String path = "";
- public IconCompressUtil(String path) {
- this.path = path;
- }
- public void change(int size) {
- compressImg(new File(path), size, null);
- }
- /**
- * @param oldfile
- * @param size
- * @param newfile
- * @return
- * @作者 王建明
- * @创建日期 2012-6-16
- * @创建时间 下午03:30:48
- * @描述 —— 将oldfile的图片文件等比例压缩为size的newfile文件
- */
- public static File compressImg(File oldfile, int size, File newfile) {
- if(!newfile.exists())
- try {
- newfile.createNewFile();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- //e1.printStackTrace();
- System.out.println("无法创建文件!!!");
- return null;
- }
- BufferedImage bi;
- try {
- System.out.println("正在压缩:" + oldfile.getName());
- bi = ImageIO.read(new FileInputStream(oldfile));
- int width = bi.getWidth();
- int height = bi.getHeight();
- if (width > size || height > size) {
- Image image;
- if (width > height) {
- height = (int) (bi.getHeight() / (bi.getWidth() * 1d) * size);
- image = bi.getScaledInstance(size, height,
- Image.SCALE_DEFAULT);
- } else {
- width = (int) (bi.getWidth() / (bi.getHeight() * 1d) * size);
- image = bi.getScaledInstance(width, size,
- Image.SCALE_DEFAULT);
- }
- ImageIO.write(toBufferedImage(image), "png",
- new FileOutputStream(newfile));
- System.out.println("压缩完成:" + newfile.getName());
- return newfile;
- } else {
- System.out.println("无须压缩:" + oldfile.getName());
- return oldfile;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- public static BufferedImage toBufferedImage(Image image) {
- if (image instanceof BufferedImage) {
- return (BufferedImage) image;
- }
- image = new ImageIcon(image).getImage();
- BufferedImage bimage = null;
- GraphicsEnvironment ge = GraphicsEnvironment
- .getLocalGraphicsEnvironment();
- try {
- int transparency = Transparency.TRANSLUCENT;
- GraphicsDevice gs = ge.getDefaultScreenDevice();
- GraphicsConfiguration gc = gs.getDefaultConfiguration();
- bimage = gc.createCompatibleImage(image.getWidth(null), image
- .getHeight(null), transparency);
- } catch (HeadlessException e) {
- }
- if (bimage == null) {
- int type = BufferedImage.TYPE_INT_RGB;
- bimage = new BufferedImage(image.getWidth(null), image
- .getHeight(null), type);
- }
- Graphics g = bimage.createGraphics();
- g.drawImage(image, 0, 0, null);
- g.dispose();
- return bimage;
- }
- /**
- * @return
- * @作者 王建明
- * @创建日期 2012-8-2
- * @创建时间 下午02:00:41
- * @描述 —— 生成随机名字,不可能重复(用于文件的命名)
- */
- public static String getRandomName() {
- Random r = new Random();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
- StringBuffer sb = new StringBuffer();
- sb.append(r.nextInt(100));
- sb.append(r.nextInt(100));
- sb.append("_");
- sb.append(sdf.format(new Date()));
- sb.append("_");
- sb.append(r.nextInt(100));
- sb.append(r.nextInt(100));
- return sb.toString();
- }
- /**
- * @param inputFile源文件
- * @param outFile生成文件
- * @param width指定宽度
- * @param height指定高度
- * @param proportion是否等比例操作
- * @return
- * @作者 王建明
- * @创建日期 2012-8-2
- * @创建时间 下午02:02:38
- * @描述 —— 是否等比例缩放图片
- */
- public static boolean compressPic(String inputFile, String outFile,
- int width, int height, boolean proportion) {
- try {
- // 获得源文件
- File file = new File(inputFile);
- if (!file.exists()) {
- return false;
- }
- Image img = ImageIO.read(file);
- // 判断图片格式是否正确
- if (img.getWidth(null) == -1) {
- return false;
- } else {
- int newWidth;
- int newHeight;
- // 判断是否是等比缩放
- if (proportion == true) {
- // 为等比缩放计算输出的图片宽度及高度
- double rate1 = ((double) img.getWidth(null))
- / (double) width + 0.1;
- double rate2 = ((double) img.getHeight(null))
- / (double) height + 0.1;
- // 根据缩放比率大的进行缩放控制
- double rate = rate1 > rate2 ? rate1 : rate2;
- newWidth = (int) (((double) img.getWidth(null)) / rate);
- newHeight = (int) (((double) img.getHeight(null)) / rate);
- } else {
- newWidth = width; // 输出的图片宽度
- newHeight = height; // 输出的图片高度
- }
- // 如果图片小于目标图片的宽和高则不进行转换
- /*
- * if (img.getWidth(null) < width && img.getHeight(null) <
- * height) { newWidth = img.getWidth(null); newHeight =
- * img.getHeight(null); }
- */
- BufferedImage tag = new BufferedImage((int) newWidth,
- (int) newHeight, BufferedImage.TYPE_INT_RGB);
- // Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的,优先级比速度高 生成的图片质量比较好 但速度慢
- tag.getGraphics().drawImage(
- img.getScaledInstance(newWidth, newHeight,
- Image.SCALE_SMOOTH), 0, 0, null);
- FileOutputStream out = new FileOutputStream(outFile);
- // JPEGImageEncoder可适用于其他图片类型的转换
- JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
- encoder.encode(tag);
- out.close();
- }
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- return true;
- }
- /**
- * @param srcFile源文件
- * @param outFile输出文件
- * @param x坐标
- * @param y坐标
- * @param width宽度
- * @param height高度
- * @return
- * @作者 王建明
- * @创建日期 2012-8-2
- * @创建时间 下午02:05:03
- * @描述 —— 裁剪图片
- */
- public static boolean cutPic(String srcFile, String outFile, int x, int y,
- int width, int height) {
- FileInputStream is = null;
- ImageInputStream iis = null;
- try {
- // 如果源图片不存在
- if (!new File(srcFile).exists()) {
- return false;
- }
- // 读取图片文件
- is = new FileInputStream(srcFile);
- // 获取文件格式
- String ext = srcFile.substring(srcFile.lastIndexOf(".") + 1);
- // ImageReader声称能够解码指定格式
- Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(ext);
- ImageReader reader = it.next();
- // 获取图片流
- iis = ImageIO.createImageInputStream(is);
- // 输入源中的图像将只按顺序读取
- reader.setInput(iis, true);
- // 描述如何对流进行解码
- ImageReadParam param = reader.getDefaultReadParam();
- // 图片裁剪区域
- Rectangle rect = new Rectangle(x, y, width, height);
- // 提供一个 BufferedImage,将其用作解码像素数据的目标
- param.setSourceRegion(rect);
- // 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象
- BufferedImage bi = reader.read(0, param);
- // 保存新图片
- File tempOutFile = new File(outFile);
- if (!tempOutFile.exists()) {
- tempOutFile.mkdirs();
- }
- ImageIO.write(bi, ext, new File(outFile));
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- } finally {
- try {
- if (is != null) {
- is.close();
- }
- if (iis != null) {
- iis.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- return false;
- }
- }
- }
- /**
- * @param doubleValue
- * @return
- * @作者 王建明
- * @创建日期 2012-8-6
- * @创建时间 下午05:24:15
- * @描述 —— 将浮点型数据保留整数位转换成int型
- */
- public static Integer getRoundIntFromDouble(Double doubleValue) {
- return Integer.parseInt(String.valueOf(Math.round(doubleValue)));
- }
- }
java图片文件处理工具类【包括图片缩放,剪切等功能】
最新推荐文章于 2024-07-14 20:20:01 发布