有些时候,对于前段展示图片来说,有必要给图片添加一个属于自己程序的logo,以免其他人盗用图片,这是一个很严肃的问题,今天来给大家说说怎么给图片添加logo。
知识量说明:本篇内容比较丰富,对于不熟悉这方面的来说,可以学到很多知识,我会对比较难以理解的内容加以详细说明
本文将从两个类来进行说明
1.ImageUtil类
主要用来给图片添加logo的类
2.PathUtil类
用来创建储存图片使用到的路径
储存说明:图片是储存在自己的电脑硬盘中,数据库只是储存的一个路径,需要用到时,从自己电脑中取出来。
项目前提:1.创建合适的数据库,字段名等的合理创建
2.常用依赖的导入
3.合理的实体类对象(本文使用的是商店作为讲例)
一.准备
1.首先,准备好自己需要印上logo的图片,我已这几张图片为例。
2.这是我用到的logo图片,我将这张图片储存到项目中
3.导入jar包(项目依赖)
这里我使用的是maven管理工具,只需要导入相应的项目依赖即可
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>
二.ImageUtile类的编写
创建ImageUtil类
获取以下对象
/*String path:获取classPath的绝对路径currentThread():获取当前线程getContextClassLoader():获取当前类加载器getResource:获取当前资源*/private static final String paths=Thread.currentThread().getContextClassLoader().getResource(\"\").getPath();//设置时间格式private static final SimpleDateFormat sDateFormat = new SimpleDateFormat(\"yyyyMMddHHmmSS\");//随机数对象private static final Random random=new Random();private static final Logger logger = LoggerFactory.getLogger(ImageUtil.class);
然后编写generateThumbnail方法,此方法主要用来获取图片
其中logger对象主要用来储存日志信息,不需要者可以不写
参数说明
ImageHolder 是一个自己创建的类,里面包装了图片名字和图片
/*** 给图片添加logo 并创建文件夹储存图片* @param targetAddr* @param thumbnail* @return*/public static String generateThumbnail(ImageHolder thumbnail, String targetAddr){//生成随机文件名字String realFileName=getRandomFileName();//获取文件拓展名String extension=getFileExtension(thumbnail.getImageName());//创建目录makeDirPath(targetAddr);//获取相对路径String relativeAddr=targetAddr+realFileName+extension;logger.debug(\"current relativeAddr is:\"+relativeAddr);//组成绝对路径File dest=new File(PathUtil.getImgBasePath()+relativeAddr);logger.debug(\"current complete is:\"+PathUtil.getImgBasePath()+relativeAddr);//创建缩略图try {//去除路径中的%20String path= URLDecoder.decode(paths,\"utf-8\");logger.debug(\"Path is:\"+path);Thumbnails.of(thumbnail.getImage()).size(200,200).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(path+\"logo.jpg\")),0.25f).outputQuality(0.8f).toFile(dest);} catch (IOException e) {e.printStackTrace();}return relativeAddr;}
其中自己创建的方法有
1.getRandomFileName
/*** 生成随机文件名字* 为了保证每秒钟生成的文件名不一样* 使用当前时间加上五位随机数来创建随机数* @return*/public static String getRandomFileName() {//获取随机五位数 10000-99999int randomNum=random.nextInt(89999)+10000;String nowTime= sDateFormat.format(new Date());return nowTime+randomNum;}
2.getFileExtension获取文件后缀名
/*** 获取文件后缀名* @param fileName* @return*/private static String getFileExtension(String fileName) {//截取.好后面的字符串 并返回return fileName.substring(fileName.lastIndexOf(\".\")+1);}
3.makeDirPath:创建目标路径所涉及的目录
/*** 创建目标路径所涉及的目录* @param targetAddr*/private static void makeDirPath(String targetAddr) {String parentPath=PathUtil.getImgBasePath()+targetAddr;File dirPath=new File(parentPath);if (!dirPath.exists()){dirPath.mkdirs();}}
接下来就是PathUtil类`
//获取当前系统的文件分隔符private static String separator=System.getProperty(\"file.separator\");/*** 获取照片绝对的路径 即 根路径* @return*/public static String getImgBasePath(){//判断当前的系统String os=System.getProperty(\"os.name\");String basePath=\"\";//根据系统选择储存位置if(os.toLowerCase().startsWith(\"win\")){basePath=\"E:/o2opic/image\";}else {basePath=\"/home/image/\";}basePath=basePath.replace(\"/\",separator);return basePath;}/*** 根据需求获取图片路径* @return*/public static String getShopImagePath(Long shopId){String imagePath=\"shop/shopImage\"+shopId+\"/\";return imagePath.replace(\"/\",separator);}
然后编写适合自己的测试类来进行测试
我的代码块是这样的,没有编写测试类
先获取路径,再将图片和路径传到generateThumbnail中
private void addThumbnail(Product product, ImageHolder thumbnail) {String shopImagePath = PathUtil.getShopImagePath(product.getShop().getShopId());String thumbnail1 = ImageUtil.generateThumbnail(thumbnail, shopImagePath);product.setImgAddr(thumbnail1);}
最后的结果就是这样子