看到 https://github.com/vdvm/nginx-watermark 这个库
我尝试了下,是可行的,但是我想增加个水印平铺的功能?请问有什么是实现思路?
没写过 nginx 插件, 对 c 也只能说是了解.
看代码主要水印处理部分主要在这里
gdImageCopy(watermark_mix, dst, 0, 0, wdx, wdy, watermark->sx, watermark->sy);
gdImageCopy(watermark_mix, watermark, 0, 0, 0, 0, watermark->sx, watermark->sy);
gdImageCopyMerge(dst, watermark_mix, wdx, wdy, 0, 0, watermark->sx, watermark->sy, 75);
是不是按坐标和水印图宽度连续调用 gdImageCopy 再 gdImageCopyMerge 即可?
有没有更简单些的方法?
看到有好几个人收藏, 但是没人回复,把我实验的结果贴出来吧
直接使用gdImageCopyMerge来合并水印图和目标图的话,水印图的透明部分变成了不透明的,所以先用
gdImageCopy把将要合并的区域扣出来与水印合并,这样Merge之后视觉上就是透明的了
用连续gdImageCopyMerge的方法是可行的
int offsetx = 0,offsety = 0;
while(offsetx < dst->sx ){
gdImageCopy(watermark_mix, dst, 0, 0, offsetx, wdy, watermark->sx, watermark->sy);
gdImageCopy(watermark_mix, watermark, 0, 0, 0, 0, watermark->sx, watermark->sy);
gdImageCopyMerge(dst, watermark_mix, offsetx, wdy, 0, 0, watermark->sx, watermark->sy, 75);
while( offsety < dst->sy){
gdImageCopy(watermark_mix, dst, 0, 0, offsetx, offsety, watermark->sx, watermark->sy);
gdImageCopy(watermark_mix, watermark, 0, 0, 0, 0, watermark->sx, watermark->sy);
gdImageCopyMerge(dst, watermark_mix, offsetx, offsety, 0, 0, watermark->sx, watermark->sy, 75);
offsety = offsety + watermark->sx + 10;
}
offsetx = offsetx + watermark->sx + 10;
offsety = 0;
}
但是 这么写并不是理想的方案,因为这么处理之后的图片尺寸达到了原始图片的10倍.显然也不适合用在nginx上.
1
i8d0g OP 也许标题改成 libgd 平铺水印比较合适。。。
|