您的位置:首页 > 编程语言 > Go语言

给图片添加logo,储存图片。

2020-07-14 05:32 781 查看

有些时候,对于前段展示图片来说,有必要给图片添加一个属于自己程序的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 {
//去除路径中的%20
String 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-99999
int 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);
}

最后的结果就是这样子

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: