2019独角兽企业重金招聘Python工程师标准>>>

这两天将图片水印实践了下,代码如下,共保存记忆。

前端JSP页面如下

<%@page import="java.util.List"%>
<%@page import="com.dimensions.entity.AdsTemplates" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib uri="/struts-layout-tags" prefix="layout"%>
<layout:content_for name="title">广告-模板</layout:content_for>
<%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;String ad_position = (String)request.getAttribute("ad_position");List<AdsTemplates> listAdsTemplatesUrl = (List<AdsTemplates>)request.getAttribute("listAdsTemplatesUrl");
%>
<style>#moreBut:hover{cursor:pointer}.imgtem:hover{cursor:pointer}#freeTemplate span{width:60%;height:70%;display:block;margin-left:20%;letter-spacing:1.2em;}#freeTemplate span a{color:#FFF;font-size:16px;font-weight:bold;line-height:250%;}#adsbutton span{margin-left:7px;}#adsbutton span a{color:#FFF;font-size:16px;line-height:150%;}#adsbutton span a:hover{cursor:pointer;}#companyName{margin:0 auto;}#companyName input{width:100%;height:100%;font-size:30px;text-align:center;letter-spacing:0.6em; background:rgba(0, 0, 0, 0);}#companyConn{margin:0 auto;}#companyConn table{width:100%;height:100%;text-align:left;vertical-align:middle;}.ccWord a{font-size:26px;color:#59493F;}#companyConn table td input{width:100%;height:70%;font-size:22px;text-align:left;background:rgba(0, 0, 0, 0);border:1px solid #000;}#formSubmitBtn:hover{cursor:pointer}#formSubmitBtn span{width:30%;height:100%;display:block;margin:0 auto;}#formSubmitBtn span a{font-size:20px;letter-spacing:0.6em;color:#FFF;line-height:180%;}
</style>
<script type="text/javascript">
$(function(){var adsTcWidth = (document.body.offsetWidth)*0.64;var adsTcHeight = ((document.body.offsetWidth)*0.64)*0.8542;$("#adsTemplatesContent").css({"width":adsTcWidth+"px","height":adsTcHeight+"px","border":"1px solid #A8A8A8","margin-left":"17%","overflow":"hidden"});var freeTemplateWidth = adsTcWidth*0.2667;var freeTemplateHeight = freeTemplateWidth*0.18;$("#freeTemplate").css({"width":freeTemplateWidth+"px","height":freeTemplateHeight+"px","background-color":"#706054","margin-top":"15px","margin-left":-(freeTemplateWidth*0.27)+"px","transform":"rotate(-45deg)",});var adsbuttonWidth = adsTcWidth*0.1875;var adsbuttonHeight = adsbuttonWidth*0.1667;var adsbuttonTop = $("#adsTemplatesContent").position().top;var adsbuttonLeft = $("#adsTemplatesContent").position().Left;$("#adsbutton").css({"width":adsbuttonWidth+"px","height":adsbuttonHeight+"px","background-color":"#706054","margin-top":(10-freeTemplateHeight)+"px","margin-left":(adsTcWidth-adsbuttonWidth-8)+"px"});var companyNameWidth = adsTcWidth*0.7625;var companyNameHeight = companyNameWidth*0.1093;$("#companyName").css({"width":companyNameWidth+"px","height":companyNameHeight+"px","margin-top":"6%","border":"2px dashed #FFF"});var companyConnHeight = adsTcHeight*0.3805;$("#companyConn").css({"width":companyNameWidth+"px","height":companyConnHeight+"px","margin-top":"8%",});var formSubmitBtnWidth = adsTcWidth*0.2625;var formSubmitBtnHeight = formSubmitBtnWidth*0.1733;$("#formSubmitBtn").css({"width":formSubmitBtnWidth+"px","height":formSubmitBtnHeight+"px","background-color":"#6CBEF6","margin":"0 auto","margin-top":"20px"});$("#moreBut").click(function(){var atDisplay = $("#adsTemplates").css("display");$("#adsTemplates").slideToggle();if(atDisplay=="block"){$("#moreBut").text("更多∨");}else{$("#moreBut").text("收起∧");}});$("#changeButton").click(function(){});$("#cancelButton").click(function(){$("#adsTemplatesContent").css({"background-image":('url("")'),"background-repeat":"","background-size":""});});$("#formSubmitBtn").click(function(){var companyName = $("#companyConnForm").find("input[name='companyName']").val();var imgageUrl = $("#companyConnForm").find("input[name='imgageUrl']").val();var linkman = $("#companyConnForm").find("input[name='linkman']").val();var address = $("#companyConnForm").find("input[name='address']").val();var majorBus = $("#companyConnForm").find("input[name='majorBus']").val();var contactNum = $("#companyConnForm").find("input[name='contactNum']").val();if(companyName==undefined || companyName.trim()=="请在这里输入公司名称" || companyName==null){alert("公司名称不能为空.");return false;}if(imgageUrl==undefined ||imgageUrl.trim()=="" || imgageUrl==null){alert("请选择背景图片.");return false;}if(linkman==undefined ||linkman.trim()=="" || linkman==null){alert("请输入联系人.");return false;}if(address==undefined ||address.trim()=="" || address==null){alert("请输入地址.");return false;}if(majorBus==undefined ||majorBus.trim()=="" || majorBus==null){alert("请输入主营业务.");return false;}if(contactNum==undefined ||contactNum.trim()=="" || contactNum==null){alert("请输入联系电话.");return false;}$("#companyConnForm").submit();});
});
function imgtemBack(node){var backImgUrl = $(node).children("img").attr("src");console.log(backImgUrl);$("#adsTemplatesContent").css({"background-image":('url("'+backImgUrl+'")'),"background-repeat":"no-repeat","background-size":"100% 100%"});$("#companyConnForm").find("input[name='imgageUrl']").val(backImgUrl);
}
</script>
<div style="margin:0 auto;width:100%;min-height:600px;background-color:#FFF;"><div style="width:16%;height:30px;border:1px solid #E5E5E5;background-color:#F0F0F0;margin-left:17%;"><span style="margin-left:10px;"><a style="line-height:30px;font-size:14px;font-family:'Microsoft YaHei'">模板:</a></span><div id="moreBut" style="width:35px;height:20px;background-color:#FFF;border:1px solid #81CCED;float:right;margin-top:5px;margin-right:5px;">更多∨</div></div><div id="adsTemplates" style="display:none;width:64%;height:160px;padding-top:10px;border:1px solid #E5E5E5;margin-left:17%;"><%for(int i=0;i<listAdsTemplatesUrl.size();i++){%><div style="width:90px;height:140px;border:1px solid #A6A6AA;margin-left:20px;float:left;"><div style="width:80px;height:100px;margin:4px;border-radius:7px;"><a href="javascript:void(0);" onclick="imgtemBack(this)"><img id="imgtem<%=i %>" class="imgtem" style="width:100%;height:100%;" alt="img" src="<%=basePath %>/<%=listAdsTemplatesUrl.get(i).getUrl()%>"></a></div><div style="width:80px;height:20px;margin-left:4px;text-align:center;"><a>清凉(<%=i+1 %>)夏</a></div></div><% } %></div><div id="adsTemplatesContent"><div id="freeTemplate"><span><a>免费模板</a></span></div><div id="adsbutton"><span id="changeButton"><a>更换模板</a></span><span><a>|</a></span><span id="cancelButton"><a>取消模板</a></span></div><form id="companyConnForm" action="<%=request.getContextPath()%>/manage/manufactureAdsTemplates.action" method="post" style="width:100%;height:100%;"><div id="companyName"><input type="text" name="companyName" value="请在这里输入公司名称" onBlur="javascript:if(this.value.trim()=='')this.value='请在这里输入公司名称';" onfocus="javascript:if(this.value=='请在这里输入公司名称')this.value='';"/></div><div id="companyConn"><table><tr><td width="30%" class="ccWord"><a><input type="hidden" name="imgageUrl"/><input type="hidden" name="ad_position" value="<%=ad_position %>">主&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;营:</a></td><td width="70%"><input type="text" name="majorBus" onkeyup="if(this.value.length>30){this.value = this.value.substring(0,30);}"/></td></tr><tr><td width="30%" class="ccWord"><a>联系&nbsp;&nbsp;&nbsp;&nbsp;人:</a></td><td width="70%"><input type="text" name="linkman"/></td></tr><tr><td width="30%" class="ccWord"><a>联系电话:</a></td><td width="70%"><input type="text" name="contactNum"/></td></tr><tr><td width="30%" class="ccWord"><a>地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;址:</a></td><td width="70%"><input type="text" name="address" onkeyup="if(this.value.length>20){this.value = this.value.substring(0,20);}"/></td></tr></table></div></form></div><div id="formSubmitBtn"><span><a>确定</a></span></div>
</div>

Action 层代码如下:

package com.dimensions.action.manage;import java.net.URLEncoder;
import java.util.List;import org.apache.commons.lang3.StringUtils;import com.dimensions.action.Action;
import com.dimensions.dao.AdsTemplatesDao;
import com.dimensions.entity.AdsTemplates;
import com.dimensions.service.AdsTemplatesService;
import com.dimensions.utils.UrlUtils;
import com.google.inject.Inject;
/*** 类描述: 广告模板类* @author lee* @date 2017年7月13日 下午14:45:01*/
@SuppressWarnings("serial")
public class AdsTemplatesAction extends Action {@Injectprivate AdsTemplatesDao adsTemplatesDao;@Injectprivate AdsTemplatesService adsTemplatesService;/*** 跳转到使用模板界面* @return*/public String templates(){String ad_position = request.getParameter("ad_position");List<AdsTemplates> listAdsTemplatesUrl = adsTemplatesDao.query("select url from ads_templates order by position", false);request.setAttribute("ad_position", ad_position);request.setAttribute("listAdsTemplatesUrl", listAdsTemplatesUrl);return "templates";}/*** 定制 用户广告模板*/public String manufacture(){String ad_position = request.getParameter("ad_position");String companyName = request.getParameter("companyName");String imgageUrl = request.getParameter("imgageUrl");String linkman = request.getParameter("linkman");String address = request.getParameter("address");String majorBus = request.getParameter("majorBus");String contactNum = request.getParameter("contactNum");request.setAttribute("ad_position", ad_position);if(StringUtils.isNotBlank(companyName)&& StringUtils.isNotBlank(imgageUrl) && StringUtils.isNotBlank(linkman)&& StringUtils.isNotBlank(linkman) && StringUtils.isNotBlank(address)&& StringUtils.isNotBlank(majorBus) && StringUtils.isNotBlank(contactNum)){String imgUrl = adsTemplatesService.manufacture(imgageUrl,companyName,majorBus,linkman,contactNum,address,request.getRealPath("/"),this.getUser_id());String httpUrl = UrlUtils.generateDomainUrl(request)+imgUrl;request.setAttribute("adsTemplateUrl", URLEncoder.encode(httpUrl));return "addAds";}else{return "manufacture";}}
}

service层代码如下

/*** 用户提供的信息--打印相应的水印信息* @param address * @param contactNum * @param linkman * @param majorBus * @param companyName * @param imgageUrl */public String manufacture(String imgageUrl, String companyName, String majorBus, String linkman, String contactNum, String address,String savePath,Integer userId){if(StringUtils.isNotBlank(imgageUrl)){try {//读取原图片信息URL url =new URL(imgageUrl);InputStream srcImgStream=url.openStream();Image srcImg = ImageIO.read(srcImgStream);int srcImgWidth = srcImg.getWidth(null);//获取图片的宽度和高度int srcImgHeight = srcImg.getHeight(null);//加水印BufferedImage bufImg =  new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = bufImg.createGraphics();g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);//公司名称g.setFont(new Font("微软雅黑", Font.BOLD, 38));g.setColor(new Color(89,72,63,255));float companyX = (srcImgWidth - getWatermarkLength(companyName, g))/2;float companyY = (float) (srcImgHeight*0.222);g.drawString(companyName,companyX , companyY);//主营g.setFont(new Font("微软雅黑", Font.BOLD, 26));g.setColor(new Color(77,51,40,255));float captionX = (float) ((srcImgWidth-(srcImgWidth*0.7025))/2);float captionY = (float)(companyY*1.8);float contentX = (float) (captionX+srcImgWidth*0.203); g.drawString("主       营:",captionX , captionY);if(majorBus.length()<16){g.drawString(majorBus,contentX , captionY);g.drawString("联  系 人:",captionX , (float)(captionY+srcImgHeight*0.1032));g.drawString(linkman,contentX , (float)(captionY+srcImgHeight*0.1032));g.drawString("联系电话:",captionX , (float)(captionY+srcImgHeight*0.1032*2));g.drawString(contactNum,contentX , (float)(captionY+srcImgHeight*0.1032*2));g.drawString("地       址:",captionX , (float)(captionY+srcImgHeight*0.1032*3));g.drawString(address,contentX ,(float)(captionY+srcImgHeight*0.1032*3));}else{if(majorBus.length()>30){majorBus = majorBus.substring(0, 30);}g.drawString(majorBus.substring(0, 15),contentX , captionY);g.drawString(majorBus.substring(15, majorBus.length()),contentX, (float)(captionY+srcImgHeight*0.1032*0.7));g.drawString("联  系 人:",captionX , (float)(captionY+srcImgHeight*0.1032*1.7));g.drawString(linkman,contentX , (float)(captionY+srcImgHeight*0.1032*1.7));g.drawString("联系电话:",captionX , (float)(captionY+srcImgHeight*0.1032*2.7));g.drawString(contactNum,contentX , (float)(captionY+srcImgHeight*0.1032*2.7));g.drawString("地       址:",captionX , (float)(captionY+srcImgHeight*0.1032*3.7));g.drawString(address,contentX ,(float)(captionY+srcImgHeight*0.1032*3.7));}g.dispose();//输出图片String fileName =UUID.randomUUID()+".png";//数据库保存图片信息UploadedImages uploadedImages = new UploadedImages();uploadedImages.setContent_type("image/png");uploadedImages.setFilename(fileName);uploadedImages.setCreated_by(userId);uploadedImages.setCreated_at(DateUtils.currentDateTime());//uploadedImages.setSize("不知道");uploadedImages.setWidth(srcImgWidth);     //得到图片的宽度uploadedImages.setHeight(srcImgHeight);   //得到图片的高度uploadedImagesDao.insert(uploadedImages);//创建存储路径Integer uploaded_image_id = uploadedImagesDao.lastInsertId().intValue();String newurl = ImageUtils.buildTopicPath(uploaded_image_id+"") +"/"+fileName;String outFilepath = savePath+"/uploaded_images/"+ newurl;File savePathFile = new File(savePath+"/uploaded_images/"+ImageUtils.buildTopicPath(uploaded_image_id+"") +"/");if(!savePathFile.exists()){savePathFile.mkdirs();}FileOutputStream outImgString = new FileOutputStream(outFilepath);ImageIO.write(bufImg, "png", outImgString);System.out.println("====水印添加完成=====");outImgString.flush();outImgString.close();return "/uploaded_images/"+newurl;} catch (IOException e) {e.printStackTrace();} catch (DaoException e) {e.printStackTrace();}}return "";}/*** 获取水印长度*/public float getWatermarkLength(String waterMarkContent, Graphics2D g) {  return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());  }

最终效果:

转载于:https://my.oschina.net/u/3551274/blog/1439257

图片水印 之 二相关推荐

  1. 如何给原图添加文字水印和图片水印

    今天记录一下如何给自己的图片添加记号(两种方法:一是添加图片水印,二是添加文字水印,我都有哦!!!),防止有人盗图侵权,但是该方法不是修图,是源码敲出来的,适用于android开发!!! 话不多说,稍 ...

  2. C# 处理PPT水印(二)——去除水印效果(文本水印、图片水印)

    本文将对C#处理PPT幻灯片中的水印进一步说明和介绍.在C# 处理PPT水印(一)一文中,分享了如何插入水印效果的方法,包括插入文字水印效果.插入图片作为水印效果两种情况,那对于不需要水印效果的情况, ...

  3. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  4. ASP.NET2.0打通文件图片处理任督二脉【月儿原创】

    ASP.NET2.0打通文件图片处理任督二脉 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.1 1.最简单的单文件上传(没 ...

  5. CSDN博文中完美地去掉图片水印、调整图片位置和大小

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 写博客的时候,大多数人会有这种感觉:图片上传会有水印,位置默认靠左,有时候嫌直接上传比较大,不太美观,特此查找了解决办法 ...

  6. php给图片加图片水印,php给图片添加文字或图片水印实现代码

    原标题:php给图片添加文字或图片水印实现代码 一.文字水印 文字水印就是在图片上加上文字,主要使用gd库的imagefttext方法,并且需要字体文件.效果图如下: $dst_path = 'dst ...

  7. 去除图片水印_只需一键,即可快速去除图片水印!如此简单的方法,谁不知谁吃亏...

    现在有很多小伙伴都会到网上找一些好看的图片保存下来,但是很多时候我们找到的图片都是带有水印的,虽然水印很小,但是看起来也是怪怪的.别担心,今天小编将分享几个简单又好用的图片去水印方法给大家,有需要的小 ...

  8. ASP.NET2.0打通文件图片处理任督二脉[转载]

    ASP.NET2.0打通文件图片处理任督二脉 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.1 1.最简单的单文件上传(没 ...

  9. word图文设计:如何用图片水印功能制作日历画册

    新的一年马上来临了,许多人都会换上新的日历.通常大家都是去外面购买,买来的日历总是千篇一律,没有特色.为何不自己新自己动手制作一本专属于自己的个性日历呢?做好后,自己使用或作为礼物送给亲朋好友都很不错 ...

  10. indesign选中不了图片删除_word图文设计:如何用图片水印功能制作日历画册

    编按:新的一年马上来临了,许多人都会换上新的日历.通常大家都是去外面购买,买来的日历总是千篇一律,没有特色.为何不自己新自己动手制作一本专属于自己的个性日历呢?做好后,自己使用或作为礼物送给亲朋好友都 ...

最新文章

  1. [十一]基础数据类型之Character
  2. 动态CSS - LESS学习总结
  3. redhat linux ls ls,Linux(3)RedHat7 基本命令二-ls命令詳解
  4. f450四轴使用技巧
  5. [转] 最近点对距离问题
  6. 如何让小程序页面更顺滑_小程序怎样让wx.navigateBack更好用的方法实现
  7. 什么是空间分配担保策略?
  8. mysql union 别名报错_MySQL中UNION和UNION ALL的使用
  9. 前端简单h5播放器的制作
  10. LaTeX 下载及命令行
  11. Vue组件间通信:父传子(props),子传父($emit)
  12. Canvas绘制地图
  13. 漂亮特殊字体可复制_特殊字体生成器 漂亮特殊字体可复制
  14. Android中安装ADB工具
  15. html5制作坦克大战
  16. 使用ALLpairs完成正交表测试法练习题
  17. 一招教你快速取消Mac系统开机密码的方法
  18. VisualGDB编译关键参数设置
  19. 现代金融经济的眼重看历史[程序员学经济二]
  20. linux点滴yan

热门文章

  1. OP和DBA相关的一些有用资源
  2. WCF如何使用X509证书(安装和错误)(二)
  3. 【转】C# 中@符号在字符串中的作用
  4. spring注入bean的三种方法
  5. 已锁定 java.lang.Object@25ff46f5
  6. 2014年武汉的IT行情好像不太好(续):20个月过后,再看当时面试过的几个公司--武汉财富基石-崩盘,辣妈萌宝-创业失败,朋友公司转交他人管理...
  7. Struts分页的一个实现
  8. Linq 2 DataSet
  9. 记:从百度空间搬家到博客园--写博客要写的舒服
  10. 实验吧Web-易-简单的sql注入之3(报错的sql盲注之exp)