图片自动生成子图并添加图片水印

//定义好水印 Logo 和水印颜色

private static Boolean isLogoImage=false;

private static String logoText="www.grainger.cn";

private static Color color=new Color(220,220,220);

main方法开始

 public static void main(String[] args) throws Exception{
 
        String imgFile="D://test/001.jpg";
        
        InputStream in = null;
        
        byte[] data = null;
        
        // 读取图片字节数组
        try {
            in = new FileInputStream(imgFile);
            
            data = new byte[in.available()];
            
            in.read(data);
            
            in.close();
            
        } catch (IOException e) {
        
            e.printStackTrace();
            
        }

        String originalFilename=StringUtils.substringAfterLast(imgFile,"/");
        
        store(originalFilename,data);

    }

store方法将图片文件转化的byte[]数组转化为inputStream流和文件名传入storeimpl(有点鸡肋,当时这样显得逻辑清晰一些)

 public static String store(String originalFilename, byte[] contents) throws Exception {
 
        InputStream inputStream = new ByteArrayInputStream(contents);
        
        return storeImpl(originalFilename, inputStream, false);
    }

storeimpl定义水印和子图生成的新地址与子图的规格

private static String storeImpl(String originalFilename, InputStream inputStream, Boolean isTemp) throws Exception {

    String newPath = "D://test/product/" + StringUtils.substringBefore(originalFilename, ".");

    int[] newWidth = null;

    BufferedImage bufferedImage = ImageIO.read(inputStream);
    
    if (null == bufferedImage) {
    
        throw new BizException("invalid file name");
    }
    if(isLogoImage) {
        newWidth=new int[3];
        newWidth[0]=80;
        newWidth[1]=160;
        newWidth[2]=350;
    }
    else {
        newWidth=new int[4];
        newWidth[0]=115;
        newWidth[1]=350;
        newWidth[2]=800;
        newWidth[3]=1200;
    }
    
    for (int i = 0; i < newWidth.length; i++) {
    
        int originalWidth = bufferedImage.getWidth();
        
        int originalHeight = bufferedImage.getHeight();
        
        //子图生成
        if(bufferedImage.getWidth()>bufferedImage.getHeight()) {
        
            double scale = (double) originalWidth / (double) newWidth[i];    // 缩放的比例
            
            int newHeight = (int) (originalHeight / scale);
            
            zoomImageUtils(originalFilename, newPath, bufferedImage, newWidth[i], newHeight);
        }
        else{
        
            double scale = (double) originalHeight / (double) newWidth[i];    // 缩放的比例
            
            int newHeight=(int) (originalWidth/scale);
            
            zoomImageUtils(originalFilename, newPath, bufferedImage,newHeight, newWidth[i]);
        }
    }
    return null;
}

//生产指定size子图

 private static void zoomImageUtils(String originalFilename, String newPath, BufferedImage bufferedImage, int width, int height) throws IOException {
 
        String suffix = StringUtils.substringAfterLast(originalFilename, ".");

        // 处理 png 背景变黑的问题
        if (suffix != null && (suffix.trim().toLowerCase().endsWith("png") || suffix.trim().toLowerCase().endsWith("gif"))) {
        
            BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            
            Graphics2D g2d = to.createGraphics();
            
            to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
            
            g2d.dispose();
            
            g2d = to.createGraphics();
            
            Image from = bufferedImage.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING);
            
            g2d.drawImage(from, 0, 0, null);

            //加水印
            if (maxValue(width,height) > 799) {
            
                g2d.setColor(new Color(220, 220, 220));
                
                g2d.setFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD, (width+height) / 20));
                
                g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.55f));
                
                g2d.rotate(Math.toRadians(45),width/5,height/5);
                
                g2d.drawString(logoText, width/5, height /5);
                
            }
            g2d.dispose();
            
            newPath = selectNewPath(width, newPath, suffix);
            
            ImageIO.write(to, suffix, new File(newPath));
            
        } else {
        
            BufferedImage newImage = new BufferedImage(width, height, bufferedImage.getType());
            
            Graphics g = newImage.getGraphics();
            
            g.drawImage(bufferedImage, 0, 0, width, height, null);

            //加水印
            if (maxValue(width,height) > 799) {
            
                g.setColor(new Color(220, 220, 220));
                
                g.setFont(new java.awt.Font("微软雅黑", java.awt.Font.BOLD, (width+height) / 20));
                
                ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.55f));
                
                ((Graphics2D) g).rotate(Math.toRadians(45),width/5,height/5);
                
                g.drawString(logoText, width /5, height /5);
                
            }
            g.dispose();
            
            width=maxValue(width,height);
            
            newPath = selectNewPath(width, newPath, suffix);
            
            ImageIO.write(newImage, suffix, new File(newPath));
            
            System.out.println("完成!");
        }
    }

// 获取宽高最大值

private static int maxValue(int width, int height) {
    return width>height?width:height;
}

//生成子图名称后缀

private static String selectNewPath(Integer width, String newPath, String suffix) {

    if (width.equals(80)) {
        newPath += "_s80.";
        newPath += suffix;
    }else if (width.equals(115)) {
        newPath += "_s115.";
        newPath += suffix;
    } else if (width.equals(160)) {
        newPath += "_s160.";
        newPath += suffix;
    } else if (width.equals(350)) {
        newPath += "_s350.";
        newPath += suffix;
    }else if (width.equals(800)) {
        newPath += "_s800.";
        newPath += suffix;
    } else {
        newPath += "_s1200.";
        newPath += suffix;
    }
    return newPath;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值