美文网首页
IOS端打复杂水印自适应水印高度和位置

IOS端打复杂水印自适应水印高度和位置

作者: 激动的厨师 | 来源:发表于2022-10-08 15:17 被阅读0次

    如果只是打简单的一样文字或者几行问题,可以直接在画布

    //以原图的图大小为画布创建上下文
        UIGraphicsBeginImageContext(image.size)
    

    内直接画上文字。
    如果是稍微复杂的比如 图片和 文字组合的水印。也可以直接画但是位置结算麻烦。推荐先把水印的布局写出来一个view然后用view生成图片,再把图片合成到原图上。
    view生成图片的方法(该方法只能在主线程使用,否则会crash):

    #pragma mark 生成image
    + (UIImage *)makeImageWithView:(UIView *)view withSize:(CGSize)size{
        //下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度
        UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
    

    打水印方法

    /// 水印合成
    /// @param image 原图
    /// @param waterModel 水印model
    +(UIImage *)putWaterImageWith:(UIImage *)image waterModel:(WaterModel*)waterModel{
        
        //以原图的图大小为底图
        CGFloat w1 = image.size.width;
        CGFloat h1 = image.size.height;
      
        CGFloat contextH;
        if (h1 > w1) {
            contextH = h1 * (120 / APP_HEIGHT);
        }else{
            contextH = w1 * (120 / APP_HEIGHT);
        }
        
        WaterView *view = [[WaterView alloc] initWithImageSize:image.size frame:CGRectMake(0, 0, w1, contextH) waterModel:waterModel];
        [view layoutIfNeeded];
        
        UIImage *waterImage = [GetWaterImage makeImageWithView:view withSize:CGSizeMake(w1, view.height)];
        CGFloat h = waterImage.size.height;
        
    
        //以原图的图大小为画布创建上下文
        UIGraphicsBeginImageContext(image.size);
        [image drawInRect:CGRectMake(0, 0, w1, h1)];//先把1.png 画到上下文中
        [waterImage drawInRect:CGRectMake(0, h1-h, w1, h)];//再把小图放在上下文中
        UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();//从当前上下文中获得最终图片
        UIGraphicsEndImageContext();//关闭上下文
            
        return resultImg;
    }
    
    
    这里用图片的长宽 比较 大的 一个 作为 水印高度的锚定点,以适配不同尺寸图片。
    

    WaterView 内部计算自己的缩放比例:

            self.scal = 1;
            self.scal = frame.size.width / APP_WIDTH;
            if (size.width > size.height) {
                self.scal = size.height / APP_WIDTH;
            }
    

    WaterView 内部计算自己的尺寸:

     CGFloat addressBottom = self.addressLb.bottom;
            CGSize tagSize = [self.tagsLb.text sizeForFont:self.tagsLb.font maxWidth:CGSizeMake(self.width - 2*margin, 100)];
            self.height = tagSize.height + addressBottom + 2 * margin;
    
      然后用渲染后的 WaterView的高度和宽度 生成图片。最后合成到原图上,位置可自己设定。这样水印图片可适配所有尺寸图片。
    

    如果涉及到图片压缩,建议先压缩在打水印,这样水印不会模糊。

    相关文章

      网友评论

          本文标题:IOS端打复杂水印自适应水印高度和位置

          本文链接:https://www.haomeiwen.com/subject/scqwartx.html