美文网首页
使用GPUIMage 添加图片、文字和gif水印

使用GPUIMage 添加图片、文字和gif水印

作者: cj小牛 | 来源:发表于2022-02-10 17:08 被阅读0次
    #import "ViewController.h"
    #import "GPUImage.h"
    #import <AssetsLibrary/ALAssetsLibrary.h>
    
    @interface ViewController ()
    @property (nonatomic , strong) UILabel  *mLabel;
    @end
    
    
    @implementation ViewController
    {
    GPUImageMovie *movieFile;
    GPUImageOutput<GPUImageInput> *filter;
    GPUImageMovieWriter *movieWriter;
    NSArray * _gifImages;
    int _currenIndex;
    NSTimeInterval _duration;
    }
    
    - (void)viewDidLoad {
    [super viewDidLoad];
    GPUImageView *filterView = [[GPUImageView alloc] initWithFrame:self.view.frame];
    self.view = filterView;
    
    self.mLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
    self.mLabel.textColor = [UIColor redColor];
    [self.view addSubview:self.mLabel];
    
    // 滤镜
    filter = [[GPUImageNormalBlendFilter alloc] init];
    

    // [(GPUImageDissolveBlendFilter *)filter setMix:0.5];

    // 播放
    NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"abc" withExtension:@"mp4"];
    AVAsset *asset = [AVAsset assetWithURL:sampleURL];
    CGSize size = self.view.bounds.size;
    movieFile = [[GPUImageMovie alloc] initWithAsset:asset];
    movieFile.runBenchmark = YES;
    movieFile.playAtActualSpeed = YES;
    
    // 水印
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    label.text = @"我是水印";
    label.font = [UIFont systemFontOfSize:30];
    label.textColor = [UIColor redColor];
    [label sizeToFit];
    UIImage *image = [UIImage imageNamed:@"watermark.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame= CGRectMake(0, 0, 40, 40);
    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.height, size.width)];
    subView.backgroundColor = [UIColor clearColor];
    imageView.center = CGPointMake(subView.bounds.size.width / 2, subView.bounds.size.height / 2+80);
    [subView addSubview:imageView];
    [subView addSubview:label];
    
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"lunchGif的副本.gif" ofType:nil] ;
    NSData *imageData = [NSData dataWithContentsOfFile:path];
    
    _gifImages = [NSArray array];
    _gifImages = [self praseGIFDataToImageArray:imageData];
    _duration = [self durationForGifData:imageData];
    _currenIndex = 0;
    UIImage *image1 = _gifImages[_currenIndex];
    UIImageView *imageV = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, image1.size.width*0.3, image1.size.height *0.3)];
    imageV.backgroundColor = [UIColor orangeColor];
    
    imageV.image = _gifImages[_currenIndex];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    [subView addSubview:imageV];
    
    GPUImageUIElement *uielement3 = [[GPUImageUIElement alloc] initWithView:subView];
    
    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
    unlink([pathToMovie UTF8String]);
    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
    
    movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640, 480)];
    
    GPUImageFilter* progressFilter = [[GPUImageFilter alloc] init];
    [movieFile addTarget:progressFilter];
    [progressFilter addTarget:filter];
    [uielement3 addTarget:filter];
    
    
    movieWriter.shouldPassthroughAudio = YES;
    movieFile.audioEncodingTarget = movieWriter;
    [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
    // 显示到界面
    [filter addTarget:filterView];
    [filter addTarget:movieWriter];
    
    
    [movieWriter startRecording];
    [movieFile startProcessing];
    
    
    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) {
        dispatch_async(dispatch_get_main_queue(), ^{
    
            _currenIndex ++;
              imageV.image = _gifImages[_currenIndex];
              if (_currenIndex == _gifImages.count -1) {
    
                  _currenIndex = 0;
              }
              [uielement3 update];
    
        });
        [uielement3 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)");
        }
      }];
    }
    
    
    
    - (void)updateProgress
    {
        self.mLabel.text = [NSString stringWithFormat:@"Progress:%d%%", (int)(movieFile.progress * 100)];
        [self.mLabel sizeToFit];
    }
    
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }
    
    
     - (void)didReceiveMemoryWarning
      {
      [super didReceiveMemoryWarning];
    }
    
    
    //gif 转数组、
    -(NSMutableArray *)praseGIFDataToImageArray:(NSData *)data;
    {
    NSMutableArray *frames = [[NSMutableArray alloc] init];
    CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)data, NULL);
    CGFloat animationTime = 0.f;
    if (src) {
        size_t l = CGImageSourceGetCount(src);
        frames = [NSMutableArray arrayWithCapacity:l];
        for (size_t i = 0; i < l; i++) {
            CGImageRef img = CGImageSourceCreateImageAtIndex(src, i, NULL);
            NSDictionary *properties = (NSDictionary *)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(src, i, NULL));
            NSDictionary *frameProperties = [properties objectForKey:(NSString *)kCGImagePropertyGIFDictionary];
            NSNumber *delayTime = [frameProperties objectForKey:(NSString *)kCGImagePropertyGIFUnclampedDelayTime];
            animationTime += [delayTime floatValue];
            if (img) {
                [frames addObject:[UIImage imageWithCGImage:img]];
                CGImageRelease(img);
            }
        }
        CFRelease(src);
    }
    return frames;
    }
    
    //获取gif图片的总时长和循环次数
    - (NSTimeInterval)durationForGifData:(NSData *)data{
    //将GIF图片转换成对应的图片源
    CGImageSourceRef gifSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
    //获取其中图片源个数,即由多少帧图片组成
    size_t frameCout = CGImageSourceGetCount(gifSource);
    //定义数组存储拆分出来的图片
    NSMutableArray* frames = [[NSMutableArray alloc] init];
    NSTimeInterval totalDuration = 0;
    for (size_t i=0; i<frameCout; i++) {
        //从GIF图片中取出源图片
        CGImageRef imageRef = CGImageSourceCreateImageAtIndex(gifSource, i, NULL);
        //将图片源转换成UIimageView能使用的图片源
        UIImage* imageName = [UIImage imageWithCGImage:imageRef];
        //将图片加入数组中
        [frames addObject:imageName];
        NSTimeInterval duration = [self gifImageDeleyTime:gifSource index:i];
        totalDuration += duration;
        CGImageRelease(imageRef);
    }
    
     //获取循环次数
    NSInteger loopCount;//循环次数
    CFDictionaryRef properties = CGImageSourceCopyProperties(gifSource, NULL);
    if (properties) {
        CFDictionaryRef gif = CFDictionaryGetValue(properties, kCGImagePropertyGIFDictionary);
        if (gif) {
            CFTypeRef loop = CFDictionaryGetValue(gif, kCGImagePropertyGIFLoopCount);
            if (loop) {
         //如果loop == NULL,表示不循环播放,当loopCount  == 0时,表示无限循环;
                CFNumberGetValue(loop, kCFNumberNSIntegerType, &loopCount);
      };
        }
    }
    
    CFRelease(gifSource);
    return totalDuration;
    }
    
    //获取GIF图片每帧的时长
    - (NSTimeInterval)gifImageDeleyTime:(CGImageSourceRef)imageSource index:(NSInteger)index {
     NSTimeInterval duration = 0;
     CFDictionaryRef imageProperties =     CGImageSourceCopyPropertiesAtIndex(imageSource, index, NULL);
     if (imageProperties) {
       CFDictionaryRef gifProperties;
       BOOL result = CFDictionaryGetValueIfPresent(imageProperties, kCGImagePropertyGIFDictionary, (const void **)&gifProperties);
       if (result) {
           const void *durationValue;
           if (CFDictionaryGetValueIfPresent(gifProperties, kCGImagePropertyGIFUnclampedDelayTime, &durationValue)) {
               duration = [(__bridge NSNumber *)durationValue doubleValue];
               if (duration < 0) {
                   if (CFDictionaryGetValueIfPresent(gifProperties, kCGImagePropertyGIFDelayTime, &durationValue)) {
                       duration = [(__bridge NSNumber *)durationValue doubleValue];
                   }
               }
           }
       }
     }
    
     return duration;
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:使用GPUIMage 添加图片、文字和gif水印

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