mysql图片添加水印_OSS 图片添加水印 image/watermark,image_

需求:对已存在于OSS对象存储空间中的图片添加水印;

依赖:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

importcom.aliyun.oss.OSSClient;importcom.aliyun.oss.model.ObjectMetadata;importcom.aliyun.oss.model.PutObjectResult;

com.aliyun.oss

aliyun-sdk-oss

3.10.2

View Code

简单方式(公共读)的水印添加:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

/*** @Author qtl

* @Description 水印路径

* @Date 15:29 2020/9/29

* @Param [fileName]

*@returnjava.lang.String

**/

public staticString getWaterMarkUrl(String fileName){if (!StringUtils.isEmpty(fileName)) {

FileNameMap fileNameMap=URLConnection.getFileNameMap();

String contentTypeFor=fileNameMap.getContentTypeFor(fileName);

String url= "";if (contentTypeFor != null) {//图片

int index = fileName.indexOf(".");

String str= fileName.substring(index + 1);

String newstr= str.toLowerCase();//使用toLowerCase()方法实现小写转换//String newstr2 = str.toUpperCase();//使用toUpperCase()方法实现大写转换

if(!"gif".equalsIgnoreCase(newstr)){

url= "https://OSS对象空间名.oss-cn-hangzhou.aliyuncs.com/文件在OSS对象存储空间中所在目录/" + fileName +

"?x-oss-process=image/watermark,image_d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjA1MDc1OTE2OTIzLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1,t_100,g_se,x_5,y_5";

}else{

url= "https://OSS对象空间名.oss-cn-hangzhou.aliyuncs.com/文件在OSS对象存储空间中所在目录/" +fileName; }

}returnurl;

}else{return "";

}

}

View Code

解释:

传入参数是文件在OSS对象存储空间中的名称;

判断文件是否是图片;

判断是否是【gif】格式的图片,如果是的话就不加水印了,因为阿里云对于图片水印的处理是获取图片的第一帧进行加水印的,如果是gif的图片就会导致水印加成功了,而gif变成了静态图;

【url】路径拼接规则:从【https://】到【fileName】的配置就不多说了,代码里面有文字叙述,重点在【fileName】之后的代码,【+ "?x-oss-process=image/watermark,image_d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjA1MDc1OTE2OTIzLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1,t_100,g_se,x_5,y_5"】这段代码就是水印的信息,主要是水印的路径和水印在图片中摆放的位置以及水印的大小、透明度等;【?x-oss-process=image/watermark,image_】这段代码是指此样式是加水印的配置;

【d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjA1MDc1OTE2OTIzLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1】这段代码是水印图片的路径、水印大小等信息,这个是经过base64处理过的字符串(阿里云官方推荐处理器网址:https://simplycalc.com/base64url-encode.php?spm=a2c4g.11186623.2.21.43eb26037IB7HM),未处理前的数据例子【文件在OSS对象存储空间中所在路径/水印文件全名?x-oss-process=image/resize,P_15】(P是指定水印图片按照主图的比例进行缩放,取值为缩放的百分比,一定要大写)经过base64处理后就如代码中的一串了;

【t_100,g_se,x_5,y_5】这段代码中【t】是代表不透明度,当为100时即为不透明,【g_se】是代表水印的在图片上的摆放方位为右下(共有9中,具体的请看下方提供的阿里云官方文档),【x_5,y_5】代表水印水平边距5、中线垂直偏移5;

复杂方式(私密读)的水印添加:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

//方法名什么的就不写了,核心的代码就是这些//endpoint

private static String endpoint="https://oss-cn-hangzhou.aliyuncs.com";//accessKey

private static String accessKeyId="xxx";private static String accessKeySecret="xxx";//OSS对象存储空间名

private static String bucketName="OSS对象空间名";//文件存储目录

private static String fileDir = "文件在OSS对象存储空间中所在目录";privateOSSClient ossClient;publicOSSUpload1() {

ossClient= newOSSClient(endpoint, accessKeyId, accessKeySecret);

}/*** @Author qtl

* @Description 水印路径

* @Date 15:29 2020/9/29

* @Param [fileName]

*@returnjava.lang.String

**/

public staticString getWaterMarkUrl(String fileName){if (!StringUtils.isEmpty(fileName)) {

String[] split= fileName.split("/");//创建OSSClient实例。

OSS ossClient = newOSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);//组装样式代码

String style = "image/watermark,image_d3NfZ2cvcGhvdG9BbmRWaWRlby8xNjAzODc0NjQxMDczLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzE1,t_100,P_10,g_nw,x_20,y_10";//指定签名URL过期时间为10分钟。

Date expiration = new Date(new Date().getTime() + 1000 * 60 * 60 * 24);

GeneratePresignedUrlRequest req= new GeneratePresignedUrlRequest(bucketName, fileDir + split[split.length - 1], HttpMethod.GET);

req.setExpiration(expiration);

req.setProcess(style);

URL signedUrl=ossClient.generatePresignedUrl(req);//关闭OSSClient。

ossClient.shutdown();returnsignedUrl.toString();

}else{return "";

}

}

View Code

解释:

创建OSS链接;

组装样式代码,其中的难点就是【image/watermark,image_】后跟的经过base64处理后的水印图片信息;

私密读的数据访问链接肯定是要设定访问链接超时时间的;

创建OSS文件访问链接,需要将分别是【endpoint:OSS对象存储服务器所在区路径,这个路径可以在OSS服务器的控制台上找到】,【accessKeyId、accessKeySecret:是访问阿里云API 的密钥,尽量不要使用主密钥,创建一个 RAM 子账号并配上访问资源权限即可】;

将图片样式、超时时间追加到OSS文件访问链接上,然后调用OSS连接对象即可得到正确的加过水印的图片访问路径;

不要忘记关闭OSS链接!

总结(和获取缩略图的总结差不多):

这两种方式的大概区别已经在上面简单的叙述过了,所以简单的讲一下这两种方式的利弊:

第一种方式,简单便捷,但是因为是公共读的权限,因此对于保密性较高的数据不太友好,但是对于保密性不高的数据很好,因为这种请求连接是固定的,也就是说一个文件的访问链接在文件不移动的情况下是一直有效的,可以进行缓存;

第二种,操作复杂,是私密读的权限,安全性较高,但是无法进行缓存操作,因为数据的每次请求都需要对请求连接追加超时时间的,即使是同一个文件的请求每次也都不同,因此有缓存需求的用这种方式行不通;

在加水印时一定要判断是否是【gif】图片(注意:第二种水印添加代码中并未判断是否是gif图片);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想要在文件中添加水印,可以使用以下代码: void add_watermark(const char* filename) { // 打开文件 FILE* file = fopen(filename, "rb"); if (file == NULL) { // 文件打开失败 return; } // 读取文件头 BMP_FILE_HEADER file_header; fread(&file_header, sizeof(BMP_FILE_HEADER), 1, file); // 读取信息头 BMP_INFO_HEADER info_header; fread(&info_header, sizeof(BMP_INFO_HEADER), 1, file); // 读取像素数据 int width = info_header.biWidth; int height = info_header.biHeight; int pixel_size = info_header.biBitCount / 8; // 每个像素的大小(字节) int padding = (4 - (width * pixel_size) % 4) % 4; // 行边界对齐 int image_size = width * height * pixel_size; // 像素数据的大小 unsigned char* pixels = (unsigned char*)malloc(image_size); fread(pixels, image_size, 1, file); // 将水印文字转换为像素数据 unsigned char* watermark_pixels = NULL; int watermark_width = 0; int watermark_height = 0; int watermark_size = 0; convert_text_to_pixels("中国制造", &watermark_pixels, &watermark_width, &watermark_height, &watermark_size); // 将水印像素数据添加到图像像素数据中 int x_offset = width - watermark_width - 10; // 水印位置的横坐标偏移量 int y_offset = height - watermark_height - 10; // 水印位置的纵坐标偏移量 for (int y = 0; y < watermark_height; y++) { for (int x = 0; x < watermark_width; x++) { int image_index = (x_offset + x) * pixel_size + (y_offset + y) * width * pixel_size; int watermark_index = x * pixel_size + y * watermark_width * pixel_size; pixels[image_index]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值