图片工具类

来源:互联网 发布:ubuntu映射网络文件夹 编辑:程序博客网 时间:2024/06/06 23:54

项目用的图片工具类  包括复制图片 压缩图片 base64互转图片  bate互转图片

import com.google.common.collect.Maps;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import sun.misc.BASE64Encoder;import javax.imageio.ImageIO;import javax.imageio.stream.ImageOutputStream;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import java.util.Map;/** * 图片通用工具类 * Created by wulin */public class ImageUtils {    private static Logger logger = LoggerFactory.getLogger(ImageUtils.class);    /**     * 复制图片     *     * @param fromPath 原图片路径     * @param toPath   复制图片的路径     * @return     */    public static boolean copyImage(String fromPath, String toPath) {        return copyImage(fromPath, toPath, 1);    }    /**     * 复制图片     *     * @param fromPath 原图片路径     * @param toPath   复制图片的路径     * @param multiple 图片放大缩小的倍数, 长宽等比例放大缩小     * @return     */    public static boolean copyImage(String fromPath, String toPath, Integer multiple) {        try {            fromPath = StringUtils.convertPath(java.net.URLDecoder.decode(fromPath, "UTF-8"));            toPath = StringUtils.convertPath(java.net.URLDecoder.decode(toPath, "UTF-8"));            String suffixName = toPath.substring(toPath.lastIndexOf(".") + 1);            toPath = StringUtils.convertPath(toPath);            File file = new File(fromPath);            if (file == null || !file.isFile()) {                return false;            } else {                //要拷贝的图片                Image image = ImageIO.read(file);                int width = image.getWidth(null);   //图片原宽度                int height = image.getHeight(null); //图片原高度                Map map = calcRatio(width, height, multiple);                int toImgWidth = map.get("width");   //图片压缩后的宽度                int toImgHeight = map.get("height"); //图片压缩后的高度                BufferedImage imageTag = new BufferedImage(toImgWidth, toImgHeight, BufferedImage.TYPE_INT_RGB);                imageTag.getGraphics().drawImage(image, 0, 0, toImgWidth, toImgHeight, null);                mkDirs(toPath);                ImageIO.write(imageTag, suffixName, new File(toPath));            }        } catch (FileNotFoundException fe) {            fe.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }        return false;    }    /**     * 按指定比例计算图片压缩后的宽高度     *     * @param width    原宽度     * @param height   原高度     * @param multiple 压缩倍数  压缩后的值为  原高度/multiple 或 原宽度/multiple     * @return     */    public static Map calcRatio(Integer width, Integer height, float multiple) {        Map map = Maps.newHashMap();        if (multiple == 1) {            map.put("width", width);            map.put("height", height);            return map;        }        float toImgWidth = width;   //图片压缩后的宽度        float toImgHeight = height; //图片压缩后的高度        if (width > height)  //如果宽度超过高度以宽度为准来压缩        {            toImgWidth = width / multiple;   //图片压缩后的宽度            toImgHeight = height / (float) (width / toImgWidth); //图片压缩后的高度        } else {            toImgHeight = height / multiple; //图片压缩后的高度            toImgWidth = width / (float) (height / toImgHeight);   //图片压缩后的宽度        }        map.put("width", (int) toImgWidth);        map.put("height", (int) toImgHeight);        return map;    }    /**     * 指定图片最大宽高度计算图片压缩后的宽高度     *     * @param width     原宽度     * @param height    原高度     * @param maxWidth  图片宽度最大限制     * @param maxHeight 图片高度最大限制     * @return     */    public static Map calcRatio(Integer width, Integer height, Integer maxWidth, Integer maxHeight) {        Map map = Maps.newHashMap();        float toImgWidth = width;   //图片压缩后的宽度        float toImgHeight = height; //图片压缩后的高度        if (width > height)  //如果宽度超过高度以宽度为准来压缩        {            if (width > maxWidth)  //如果图片宽度超过限制            {                toImgWidth = maxWidth;   //图片压缩后的宽度                toImgHeight = height / (float) (width / toImgWidth); //图片压缩后的高度            }        } else {            if (height > maxHeight) {                toImgHeight = maxHeight;                toImgWidth = width / (float) (height / toImgHeight);            }        }        map.put("width", (int) toImgWidth);        map.put("height", (int) toImgHeight);        return map;    }    /**     * base64 转图片     *     * @param base64String base64字符串     * @param filePath     图片路径     */    public static boolean base64StringToImage(String base64String, String filePath) {        try {            filePath = StringUtils.convertPath(filePath);            return byteToImage(base64StringToByte(base64String), filePath);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * byte 转图片     *     * @param bytes    图片二进制     * @param filePath 图片路径     */    public static boolean byteToImage(byte[] bytes, String filePath) {        if (bytes == null || bytes.length < 1) {            return false;        }        try {            filePath = StringUtils.convertPath(java.net.URLDecoder.decode(filePath, "UTF-8"));            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);            BufferedImage bi1 = ImageIO.read(bais);            mkDirs(filePath);            File w2 = new File(filePath);//可以是jpg,png,gif格式            ImageIO.write(bi1, "jpg", w2);//不管输出什么格式图片,此处不需改动            return true;        } catch (IOException e) {            e.printStackTrace();            return false;        }    }    /**     * base64 转 byte     *     * @param base64String base64字符串     */    public static byte[] base64StringToByte(String base64String) {        try {            if (StringUtils.isBlank(base64String)) {                return null;            }            if (base64String.startsWith("data:image")) {                base64String = base64String.substring(base64String.indexOf("base64,") + "base64,".length());            }            byte[] bytes = EncodesUitls.decodeBase64(base64String);            for (int i = 0; i < bytes.length; ++i) {                if (bytes[i] < 0) {// 调整异常数据                    bytes[i] += 256;                }            }            return bytes;        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * 将  BufferedImage 转 Base64     *     * @param image     */    public static byte[] BufferedImage2Byte(BufferedImage image) {        try {            ByteArrayOutputStream bs = new ByteArrayOutputStream();            ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);            ImageIO.write(image, "png", imOut);            InputStream in = new ByteArrayInputStream(bs.toByteArray());            byte[] data = new byte[in.available()];            in.read(data);            in.close();            bs.close();            bs = null;            imOut.close();            imOut = null;            return data;        } catch (IOException e) {            e.printStackTrace();            logger.debug("Exception--" + e.getMessage());            return null;        } catch (Exception e) {            logger.debug("Exception--" + e.getMessage());            e.printStackTrace();            return null;        }    }    /**     * 将  BufferedImage 转 Base64     *     * @param image     */    public static String BufferedImage2Base64(BufferedImage image) {        try {            BASE64Encoder encoder = new BASE64Encoder();            return "data:image/png;base64," + EncodesUitls.encodeBase64(BufferedImage2Byte(image));        } catch (Exception e) {            logger.debug("Exception--" + e.getMessage());            e.printStackTrace();            return "";        }    }    /**     * 图片 转 byte     *     * @param file 图片     */    public static byte[] imageToByte(File file) {        try {            if (file == null || !file.isFile()) {                return null;            } else {                //要拷贝的图片                Image image = ImageIO.read(file);                int width = image.getWidth(null);   //图片原宽度                int height = image.getHeight(null); //图片原高度                BufferedImage imageTag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);                imageTag.getGraphics().drawImage(image, 0, 0, width, height, null);                return BufferedImage2Byte(imageTag);            }        } catch (FileNotFoundException fe) {            fe.printStackTrace();            return null;        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * 图片 转 Base64     *     * @param file 图片     */    public static String imageToBase64(File file) {        try {            if (file == null || !file.isFile()) {                return null;            } else {                //要拷贝的图片                Image image = ImageIO.read(file);                int width = image.getWidth(null);   //图片原宽度                int height = image.getHeight(null); //图片原高度                BufferedImage imageTag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);                imageTag.getGraphics().drawImage(image, 0, 0, width, height, null);                return BufferedImage2Base64(imageTag);            }        } catch (FileNotFoundException fe) {            fe.printStackTrace();            return null;        } catch (Exception e) {            e.printStackTrace();            return null;        }    }    /**     * Byte 转 Base64     *     * @param bytes 图片     */    public static String byteToBase64(byte[] bytes) {        if (bytes == null || bytes.length < 1) {            return null;        }        try {            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);            BufferedImage bi1 = ImageIO.read(bais);            return BufferedImage2Base64(bi1);        } catch (IOException e) {            e.printStackTrace();            return null;        }    }    /**     * 根据 图片 生产 相应 宽度*高度 缩略图     *     * @param imgsrc     原图路径     * @param imgdist    生产缩略图路径     * @param widthdist  生成图片宽度     * @param heightdist 生成图片高度     */    public static void reduceImg(String imgsrc, String imgdist, int widthdist,                                 int heightdist) {        try {            File srcfile = new File(imgsrc);            if (!srcfile.exists()) {                return;            }            Image src = javax.imageio.ImageIO.read(srcfile);            BufferedImage tag = new BufferedImage((int) widthdist, (int) heightdist,                    BufferedImage.TYPE_INT_RGB);            tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH), 0, 0, null);            tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist, Image.SCALE_AREA_AVERAGING), 0, 0, null);            FileOutputStream out = new FileOutputStream(imgdist);            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);            encoder.encode(tag);            out.close();        } catch (IOException ex) {            ex.printStackTrace();        }    }}