工具类:图片

开始

package com.xjxcc.util;

import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
 
public class ImageUtils {
     
    /** 图片类型:png格式 */
    public static final String IMG_TYPE_PNG = "png";
    /** 图片类型:jpg格式 */
    public static final String IMG_TYPE_JPG = "jpg";
    /** 图片类型:gif格式 */
    public static final String IMG_TYPE_GIF = "gif";
     
    /** 拼接图片类型:横向X拼接 */
    public static final int MERGE_IMG_TYPE_X = 1 ;
    /** 拼接图片类型:横向Y拼接 */
    public static final int MERGE_IMG_TYPE_Y = 2 ;
     
    /**
     * @Title: mergeImg
     * @Description: { 拼接多张图片   }(这里用一句话描述这个方法的作用) 
     * @param imgsFiles 多张图片的file  
     * @param type 生成图片类型(png、jpg)  
     * @param dst_pic 目标图片路径  
     * @param type 拼接类型   1、横向X拼接     2、纵向Y拼接
     * @throws
     */
    public static boolean mergeImg(File[] imgsFiles, String imgType, int mergeType, String dstPic) {
        int len = imgsFiles.length;
        // 判断长度是否大于0
        if (len < 1) {
            return false;
        }
        BufferedImage[] images = new BufferedImage[len];
        int[][] ImageArrays = new int[len][];
        for (int i = 0; i < len; i++) {
            try {
                images[i] = ImageIO.read(imgsFiles[i]);
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            int width = images[i].getWidth();
            int height = images[i].getHeight();
            // 从图片中读取RGB 像素
            ImageArrays[i] = new int[width * height];
            ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width);
        }
 
        int dst_height = 0, dst_width = 0, max_dst_width = 0;
        if(mergeType == MERGE_IMG_TYPE_Y){
            dst_width = images[0].getWidth();
        }else if(mergeType == MERGE_IMG_TYPE_X){
            dst_height = images[0].getHeight();
        }
        // 合成图片像素
        for (int i = 0; i < images.length; i++) {
            if(mergeType == MERGE_IMG_TYPE_Y){
                dst_width = dst_width > images[i].getWidth() ? dst_width : images[i].getWidth();
                dst_height += images[i].getHeight();
            }else if(mergeType == MERGE_IMG_TYPE_X){
                dst_height = dst_height > images[i].getHeight() ? dst_height : images[i].getHeight();
                max_dst_width = max_dst_width > images[i].getWidth() ? max_dst_width : images[i].getWidth();
                dst_width += images[i].getWidth();
            }
        }
        // 合成后的图片
        if (dst_height < 1 && dst_width < 1) {
            return false;
        }
        // 生成新图片
        try {
            BufferedImage ImageNew = new BufferedImage(dst_width, dst_height, BufferedImage.TYPE_INT_RGB);
            int height_i = 0, width_i = 0;
            for (int i = 0; i < images.length; i++) {
                if(mergeType == MERGE_IMG_TYPE_Y){
                    ImageNew.setRGB(0, height_i, dst_width, images[i].getHeight(), ImageArrays[i], 0, dst_width);
                    height_i += images[i].getHeight();
                }else if(mergeType == MERGE_IMG_TYPE_X){
                    ImageNew.setRGB(width_i, 0, images[i].getWidth(), dst_height, ImageArrays[i], 0, max_dst_width);
                    width_i += images[i].getWidth();
                }
            }
 
            File outFile = new File(dstPic);
            ImageIO.write(ImageNew, imgType, outFile);// 写图片 ,输出到硬盘
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 
     
    /**
     * 
     * @Title: changeImgSize 
     * @Description: { 改变图片的大小 }(这里用一句话描述这个方法的作用) 
     * @param imgFile 图片
     * @param newImgFile 新图片
     * @param newImgWidth 新图片的宽度
     * @param newImgHeight 新图片的高度 
     * @throws
     */
    public static void changeImgSize (File imgFile , File newImgFile , Integer newImgWidth , Integer newImgHeight){
        newImgWidth = (newImgWidth == null ? 400 : newImgWidth);
        newImgHeight = (newImgHeight == null ? 400 : newImgHeight);
        BufferedImage bimg;
        try {
            bimg = ImageIO.read(imgFile);
            Image image = bimg.getScaledInstance(newImgWidth, newImgHeight, Image.SCALE_SMOOTH);
            BufferedImage target = new BufferedImage(newImgWidth, newImgHeight,
                    BufferedImage.TYPE_INT_BGR);
            Graphics g = target.getGraphics();
            g.drawImage(image, BigDecimal.ZERO.intValue(), BigDecimal.ZERO.intValue(), null);
            g.dispose();
            ImageIO.write(target, "jpg", newImgFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
     
    /**
     * 
     * @Title: markImageByIcon 
     * @Description: { 给图片添加水印、可设置水印图片旋转角度   }(这里用一句话描述这个方法的作用) 
     * @param iconPath 水印图片路径  
     * @param srcImgPath 源图片路径  
     * @param targerPath 目标图片路径  
     * @param degree 水印图片旋转角度  
     * @throws
     */
    public static void markImageByIcon(String iconPath, String srcImgPath,   
            String targerPath, Integer degree) {   
        OutputStream os = null;   
        try {   
            Image srcImg = ImageIO.read(new File(srcImgPath));   
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);   
            // 得到画笔对象   
            Graphics2D g = buffImg.createGraphics();   
            // 设置对线段的锯齿状边缘处理   
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);   
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);   
            if (null != degree) {   
                // 设置水印旋转   
                g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);   
            }   
            // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度   
            ImageIcon imgIcon = new ImageIcon(iconPath);   
            // 得到Image对象。   
            Image img = imgIcon.getImage();   
            float alpha = 0.7f; // 透明度   
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));   
            // 表示水印图片的位置   
            g.drawImage(img, (srcImg.getWidth(null) > img.getWidth(null)?srcImg.getWidth(null) - img.getWidth(null) : 0), (srcImg.getHeight(null) > img.getHeight(null)?srcImg.getHeight(null) - img.getHeight(null) : 0) , null);   
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));   
            g.dispose();   
            os = new FileOutputStream(targerPath);   
            // 生成图片   
            ImageIO.write(buffImg, "JPG", os);   
            System.out.println("图片完成添加Icon印章。。。。。。");   
        } catch (Exception e) {   
            e.printStackTrace();   
        } finally {   
            try {   
                if (null != os)   
                    os.close();   
            } catch (Exception e) {   
                e.printStackTrace();   
            }   
        }   
    }   
}

结束

猜你喜欢

转载自blog.csdn.net/liguoqingxjxcc/article/details/81666572