GPUImage学习日记(4)之添加文字水印

前言:利用GPUImage可以给图片或者视频添加水印,大致分为三种水印:视频水印,图片水印,文字水印。其中图片水印与文字水印更为相似。本文结合具体实例来讲解录制视频时添加文字水印的实现过程。

大致思路:

1.利用GPUImageUIElement 创建相关水印(文字/图片水印)

2.创建相关GPUImageVideoCamera及GPUImageMovieWriter对象

3.给GPUImageVideoCamera添加GPUImageFilter 为target

4.通过GPUImageDissolveBlendFilter将GPUImageFilter及GPUImageUIElement 合并,即将GPUImageVideoCamera和GPUImageUIElement 添加进响应链

5.最后将GPUImageDissolveBlendFilte添加到imageview 及GPUImageMovieWriter 上即可。GPUImageMovieWriter 是响应链的终端

  • 具体实现代码如下:

     GPUImageView *filterView = [[GPUImageView alloc] initWithFrame:self.view.frame];
        self.view = filterView;
    
    
        filter = [[GPUImageDissolveBlendFilter alloc] init];
        [(GPUImageDissolveBlendFilter *)filter setMix:0.5];
        CGSize size = self.view.bounds.size;
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
        label.text = @"@兮逸博客";
        label.font = [UIFont systemFontOfSize:17.f];
        label.textColor = [UIColor redColor];
        [label sizeToFit];
        UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
        subView.backgroundColor = [UIColor clearColor];
    
        [subView addSubview:label];
        GPUImageUIElement *elementUI = [[GPUImageUIElement alloc] initWithView:subView];
    
    
        videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
        videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
    
        NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
        unlink([pathToMovie UTF8String]);
        NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
    
        movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640.0, 480.0)];
        movieWriter.encodingLiveVideo = YES;
        GPUImageFilter* progressFilter = [[GPUImageFilter alloc] init];
        [videoCamera addTarget:progressFilter];
        [progressFilter addTarget:filter];
        [elementUI addTarget:filter];
    
        //显示到界面
        [filter addTarget:filterView];
        [filter addTarget:movieWriter];
    
        videoCamera.audioEncodingTarget = movieWriter;
        [videoCamera startCameraCapture];
        [movieWriter startRecording];
    
    
        CADisplayLink* dlink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateProgress)];
        [dlink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
        [dlink setPaused:NO];
    
        __weak typeof(self) weakSelf = self;
    
    
        [progressFilter setFrameProcessingCompletionBlock:^(GPUImageOutput *output, CMTime time) {
            [elementUI updateWithTimestamp:time];
        }];
        [movieWriter setCompletionBlock:^{
            __strong typeof(self) strongSelf = weakSelf;
            [strongSelf->filter removeTarget:strongSelf->movieWriter];
            [strongSelf->movieWriter finishRecording];
            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
            if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(pathToMovie))
            {
                [library writeVideoAtPathToSavedPhotosAlbum:movieURL completionBlock:^(NSURL *assetURL, NSError *error)
                 {
                     dispatch_async(dispatch_get_main_queue(), ^{
    
                         if (error) {
                             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"视频保存失败" message:nil
                                                                            delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                             [alert show];
                         } else {
                             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"视频保存成功" message:nil
                                                                            delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                             [alert show];
                         }
                     });
                 }];
            }
            else {
                NSLog(@"error mssg)");
            }
        }];
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值