/** @author Michael Feng* @date 2017年9月4日*/import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;import javax.imageio.ImageIO;import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ImageUtils {private static final Logger logger = LoggerFactory.getLogger(ImageUtils.class);/*** * @Title: 构造图片* @Description: 生成水印并返回java.awt.image.BufferedImage* @param file*            源文件(图片)* @param waterFile*            水印文件(图片)* @param x*            距离右下角的X偏移量* @param y*            距离右下角的Y偏移量* @param alpha*            透明度, 选择值从0.0~1.0: 完全透明~完全不透明* @return BufferedImage* @throws IOException*/private static BufferedImage watermark(ImageParam param) throws IOException {// 获取原图BufferedImage buffImg = null;if(isHttpFile(param.getSourceImagePath())){InputStream sis = null;try{URL sourceUrl = new URL(param.getSourceImagePath()); sis = sourceUrl.openConnection().getInputStream();buffImg = ImageIO.read(sis);  }catch(Exception e){logger.error("读取源文件异常,{}",e);}finally{if(sis != null){sis.close();}}}else{File file = null;try{file = new File(param.getSourceImagePath());buffImg = ImageIO.read(file);}catch(Exception e){logger.error("读取源文件异常,{}",e);}}// 获取二维码BufferedImage waterImg = null;if(isHttpFile(param.getQrCodeImagePath())){InputStream sis = null;try{URL sourceUrl = new URL(param.getQrCodeImagePath()); sis = sourceUrl.openConnection().getInputStream();waterImg = ImageIO.read(sis);  }catch(Exception e){logger.error("读取二维码异常,{}",e);}finally{if(sis != null){sis.close();}}}else{File file = null;try{file = new File(param.getQrCodeImagePath());waterImg = ImageIO.read(file);}catch(Exception e){logger.error("读取二维码异常,{}",e);}}//按照要求缩放二维码if(param.getQrWidth() > 0 && param.getQrHeight() > 0){BufferedImage tag = new BufferedImage(param.getQrWidth(), param.getQrHeight(), BufferedImage.TYPE_INT_RGB);tag.getGraphics().drawImage(waterImg, 0, 0,param.getQrWidth(), param.getQrHeight(), null);waterImg = tag;}//合成图片try{int buffWidth = buffImg.getWidth();int bufHeight = buffImg.getHeight();// 创建Graphics2D对象,用在底图对象上绘图Graphics2D g2d = buffImg.createGraphics();int waterImgWidth = waterImg.getWidth();// 获取层图的宽度int waterImgHeight = waterImg.getHeight();// 获取层图的高度// 在图形和图像中实现混合和透明效果g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, param.getAlpha()));// 绘制int start = buffWidth- param.getX() - waterImgWidth;int end = bufHeight- param.getY() - waterImgHeight;if(start < 0){logger.error("X 设置过大");start = 0;}if(end < 0){logger.error("Y 设置过大");}g2d.drawImage(waterImg, start, end , waterImgWidth, waterImgHeight, null);g2d.dispose();// 释放图形上下文使用的系统资源}catch(Exception e){logger.error("合成图片字节流异常,{}",e);}return buffImg;}/*** 输出水印图片* * @param buffImg*            图像加水印之后的BufferedImage对象* @param savePath*            图像加水印之后的保存路径*/private static boolean generateWaterFile(BufferedImage buffImg, String savePath) {if(buffImg == null || StringUtils.isEmpty(savePath)){return false;}boolean rs = false;int temp = savePath.lastIndexOf(".") + 1;try {rs = ImageIO.write(buffImg, savePath.substring(temp), new File(savePath));} catch (IOException e) {logger.error("合成图片错误", e);return false;}return rs;}/*** 参数校验* @param param* @return*/private static boolean checkParam(ImageParam param ){if(param == null || StringUtils.isEmpty(param.getSourceImagePath()) || StringUtils.isEmpty(param.getQrCodeImagePath())|| StringUtils.isEmpty(param.getDestinyImagePath())){return false;}return true;}/*** 判断path是否是web请求* @param path* @return*/private static boolean isHttpFile(String path){if(!StringUtils.isEmpty(path) && path.toLowerCase().startsWith("http")){return true;}return false;}//合成图片public static boolean mergeImage(ImageParam param){if(!checkParam(param)){logger.error("参数不合法!{}",param.toString());return false;}long start = System.currentTimeMillis();try{BufferedImage buffImg = watermark(param);generateWaterFile(buffImg, param.getDestinyImagePath());  // 输出水印图片}catch(IOException e){logger.error("合成图片异常,{}",e);return false;}long end = System.currentTimeMillis();logger.info("合成图片耗时:{},合成地址:",(end - start),param.getDestinyImagePath());return true;}/*** 画圆形图片,sourcePath是原图片路径,radius是圆形图片的半径* @param sourcePath 原图片地址,不能为空* @param destinyPath 目的图片地址,不能为空* @param radius,不能为负数,为0或者null表示用图片的宽、高最小值做直径* @return*/public static boolean getCircleImage(CircleImageParam param){if(StringUtils.isEmpty(param.getSourcePath()) || StringUtils.isEmpty(param.getDestinyPath())){return false;}long start = System.currentTimeMillis();// 获取原图片BufferedImage waterImg = null;try{if(isHttpFile(param.getSourcePath())){InputStream sis = null;try{URL sourceUrl = new URL(param.getSourcePath()); sis = sourceUrl.openConnection().getInputStream();waterImg = ImageIO.read(sis);  }catch(Exception e){logger.error("读取原图片异常,{}",e);}finally{if(sis != null){sis.close();}}}else{File file = null;try{file = new File(param.getSourcePath());waterImg = ImageIO.read(file);}catch(Exception e){logger.error("读取原图片异常,{}",e);}}}catch(Exception e){logger.error("图片转换成圆形失败", e);return false;}//半径有设置时,以设置的半径为主int width = waterImg.getWidth();int height = waterImg.getHeight();int getDiameter = (width < height)?width:height;if(param.getDiameter() != null && param.getDiameter() > 0){getDiameter = param.getDiameter();}//按照要求缩放图片BufferedImage tag = new BufferedImage(getDiameter, getDiameter, BufferedImage.TYPE_INT_RGB);tag.getGraphics().drawImage(waterImg, 0, 0,getDiameter, getDiameter, null);waterImg = tag;//生成最终的图片boolean rs = false;Graphics2D g2 = null;try {tag = new BufferedImage(getDiameter, getDiameter, BufferedImage.TYPE_INT_ARGB);g2 = tag.createGraphics();g2.setComposite(AlphaComposite.Src);g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(Color.WHITE);g2.fill(new RoundRectangle2D.Float(0, 0, getDiameter, getDiameter, getDiameter,getDiameter));g2.setComposite(AlphaComposite.SrcAtop);g2.drawImage(waterImg, 0, 0, null);  int temp = param.getDestinyPath().lastIndexOf(".") + 1;rs = ImageIO.write(tag,param.getDestinyPath().substring(temp), new File(param.getDestinyPath()));} catch (IOException e) {logger.error("合成图片错误", e);return false;}finally{if(g2 != null){g2.dispose();}}long end = System.currentTimeMillis();logger.info("生成圆角图片耗时:{},图片地址:",(end - start),param.getDestinyPath());return rs;}/*** * @param args* @throws IOException*             IO异常直接抛出了* @author bls*/public static void main(String[] args) throws IOException {
//        String sourceFilePath = "https://z0.muscache.com/im/pictures/ec501732-e7bf-47d3-bdbb-cb2e9e5ddd6f.jpg";String waterFilePath = "https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=fa9140accd95d143ce7bec711299e967/2934349b033b5bb571dc8c5133d3d539b600bc12.jpg";String sourceFilePath = "C://image1.jpg";
//        String waterFilePath =  "C://image2.jpg";      String saveFilePath = "C://new.png";//        ImageParam param = new ImageParam();
//        param.setSourceImagePath(sourceFilePath);//底层原图片地址  必传
//        param.setQrCodeImagePath(waterFilePath);//二维码图片  必传
//        param.setDestinyImagePath(saveFilePath);//目标保存图片路径  必传
//        param.setX(10); // 相对底层图片右下角的横轴 像素点 默认为0
//        param.setY(100);// 相对底层图片右下角的纵轴 像素点 默认为0param.setAlpha(0.5f);//二维码图片的透明度,默认为1
//        param.setQrWidth(100);//二维码宽度
//        param.setQrHeight(50);//二维码高度
//
//        boolean rs = ImageUtils.mergeImage(param);
//        System.out.println("rs:" + rs);CircleImageParam circleParam = new CircleImageParam();circleParam.setSourcePath(sourceFilePath);//可以是网络图片,可是是本地图片circleParam.setDestinyPath(saveFilePath);//必须是本地图片,且图片格式必须是pngcircleParam.setDiameter(300);//图片直径,不指定,则是原图片宽高的最小值boolean r = ImageUtils.getCircleImage(circleParam);System.out.println("r:" + r);}
}

Java将图片处理成背景透明的圆形图片相关推荐

  1. js将base64图片处理成背景透明png

    js将base64图片处理成背景透明png var canvas = document.getElementById('canvas')let imageSource=canvas.toDataURL ...

  2. Java 创建背景透明的文字图片、将文本写到图片上

    Java 创建背景透明的文字图片.将文本写到图片上: import sun.font.FontDesignMetrics;import javax.imageio.ImageIO; import ja ...

  3. 【转】关于Java生成背景透明的png图片

    http://www.cnblogs.com/dotjava/archive/2008/09/04/1283963.html 关于Java生成背景透明的png图片 最近用到Java动态生成背景透明的图 ...

  4. Form表单提交按钮图片IE6下背景透明(js提交)

    Form表单提交按钮图片IE6下背景透明(js提交) 我们知道 光png图片在IE6下面透明方法很多,网上也很多,但是我今天遇到了个难题:form表单提交按钮png图片要求背景透明.我弄了半天,转个思 ...

  5. html如何将图片弄成背景,如何用css把图片弄成背景

    用css把图片弄成背景的方法:首先创建一个HTML示例文件:然后在body中添加一些p标签:最后使用css中的background属性将图片设置为背景即可. 本教程操作环境:Windows7系统.cs ...

  6. 怎么把http图片改成背景图HTML,web前端:将图片设置成页面的背景-网页页面设置...

    如题,字面上的意思,今天小编,就是来跟大家说一下,一个网页做一个图片背景! 将图片设置成背景,那么先找背景素材,这个背景素材可以到各大图片网站找! 那么为什么今天小编要讲这个呢? 在做一个网页中,如果 ...

  7. 如何将图片转换成表格?这有图片转换成表格好用方法

    如何将图片转换成表格?这有图片转换成表格好用方法 在日常办公和学习中,我们常常需要将图片中的表格转换成可编辑的文本格式.这时候,一些优秀的软件可以帮助我们快速地完成这项工作.你知道如何将图片转换成表格 ...

  8. 如何将visio画出的图片保存成清晰的jpg/png图片

    如何将visio画出的图片保存成清晰的jpg/png图片 将visio中要保存的图片调整到屏幕可视界面大小,尽量占满整个屏幕: 在visio界面点击:文件--另存为--png 在PNG输出选项中分辨率 ...

  9. qt设置文本背景透明_Qt修改图片的背景色及设置背景色为透明的方法

    先上干货. Qt下修改图片背景色的方法: 方法一: QPixmap CKnitWidget::ChangeImageColor(QPixmap sourcePixmap, QColor origCol ...

最新文章

  1. android从放弃到精通 第五天 excellent
  2. 以色列对话国际农民丰收节贸易会-万祥军:谋定无中生有
  3. 无锁HashMap的原理与实现
  4. mybatis-plus根据多个字段排序_Mybatis Plus学习笔记(逻辑删除/动态填充/常用插件)...
  5. mongodb和mysql的对比_MongoDB和MySQL的区别
  6. mysql text类型 使用方法_MySQL使用TEXT/BLOB类型的知识点详解
  7. 称重问题 —— 哪个是假币?
  8. Linux实现删除撤回的方法。
  9. basis问题专区(文档)
  10. 【优化算法】白头鹰搜索优化算法(BES)【含Matlab源码 1381期】
  11. 基于python的酒店管理系统_(完整版)新 基于web的酒店管理系统毕业论文
  12. 演唱会网上订票系统(SSM,JSP,MYSQL)
  13. 在SPLUS中直接连接SQLSERVER 2005
  14. 常用数字音频功放芯片-音频放大器
  15. POG个体成长模型:痛苦是成长的起点
  16. vue手机适配媒体查询用法@media
  17. KOBAS数据库使用指南
  18. HTML学习笔记_常用标签的使用及注意事项
  19. 孩子心脏发育不好,我要存孩子的心电数据
  20. 做锤子区块链手机的4种方法(行业观察)

热门文章

  1. [DebugView] dbgv.sys占用 及 KdPrint输出信息无法显示
  2. 敏捷开发:一文了解影响地图和用户故事地图之间的那些事儿
  3. ObjectUtils.isEmpty() 和 null 区别
  4. 动态规划-剪绳子问题
  5. hbase数据库_实验目的
  6. 12、【股票策略】使用backtrader回测升级版的狗股策略-基于股息率和市净率两个因子
  7. 用户场景分析的四要素是什么?
  8. 后台管理系统导出Excel表格的方法
  9. matlab如何表示抗混叠滤波,Matlab在多采样率信号处理教学中的应用
  10. 医咖会R语言学习笔记——如何安装工具包