美文网首页
iOS-图片的合并(添加水印)+GCD倒计时

iOS-图片的合并(添加水印)+GCD倒计时

作者: 叫我李五 | 来源:发表于2015-12-16 16:57 被阅读521次

    很久没有写东西了,其实有好多心得啊,小干货什么的想记录下来。懒,也是太浮躁了、沉淀下来不容易....

    图片的合并(添加水印)

    项目里面有个分享图片到朋友圈的功能。要求是给要分享的图片添加水印。大概就是把App应用的图片标签合成上去了。

    用到的是UIKit里的UIImage context,即苹果提供的以下几个方法。

    UIKIT_EXTERN void     UIGraphicsBeginImageContext(CGSize size);
    UIKIT_EXTERN void     UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) NS_AVAILABLE_IOS(4_0);
    UIKIT_EXTERN UIImage* __null_unspecified UIGraphicsGetImageFromCurrentImageContext(void);
    UIKIT_EXTERN void     UIGraphicsEndImageContext(void); 
    
    参数 含义
    size 新创建的位图、上下文的大小
    opaque 是否透明,如果图形完全不用透明,设置为YES以优化位图的存储。
    scale 缩放比例

    UIGraphicsBeginImageContextUIGraphicsBeginImageContextWithOptions相比是参数的不同,功能是相同的,相当与opaque参数为NO,scale参数为1.0。


    有了这几个方法,我们可以对UIImage做很多事情了。例如对图像等比缩放、重定义图像的大小、等等....

    而图片的合并也类似,使用的代码不多。可以把这段代码写到工具类里面,使用的时候直接调用。

    /*print:添加的图片;Origin:原始图片;*/
    + (UIImage *)addPrintImg:(UIImage *)print toOriginImg:(UIImage *)Origin
    {
         //绘制位图的大小
        UIGraphicsBeginImageContext(Origin.size);
        
        //Draw Origin
        [Origin drawInRect:CGRectMake(0, 0, Origin.size.width, Origin.size.height)];
        
        //Draw print
        [print drawInRect:CGRectMake(40, Origin.size.height-print.size.height*1.5-40, print.size.width*1.5, print.size.height*1.5)];
        
        //返回的图形大小
        UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
        
        //end 
        UIGraphicsEndImageContext();
        
        return resultImage;
    }
    
    • 实际使用中,可根据所需的来设置Origin、print的rect。
    • 需要注意的是:UIGraphicsGetImageFromCurrentImageContext方法不是线程安全的,操作太频繁的话,对于大图片的处理肯定会消耗大量的时间。
    • 对线程安全要求高的话最好使用CoreGraphics来操作图像。

    GCD倒计时

    分享一段网上找的,使用GCD来倒计时代码。感觉还是挺好用的。


    直接上代码:

    + (void)verificationCode:(void(^)())blockYes blockNo:(void(^)(id time))blockNo
    {
        //设置倒计时时间
        __block int timeout = 60;
        
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        
        dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0);
        dispatch_source_set_event_handler(_timer, ^{
            if(timeout <= 0) {
                //倒计时结束,关闭
                dispatch_source_cancel(_timer);
                dispatch_async(dispatch_get_main_queue(), ^{
                    //设置界面的按钮显示 根据自己需求设置
                    blockYes();
                });
            } else {
                // int minutes = timeout / 60;
                int seconds = timeout % 60;
                NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
                dispatch_async(dispatch_get_main_queue(), ^{
                    //NSLog(@"验证码剩余时间%@",strTime);
                    blockNo(strTime);
                });
                timeout--;
            }
        });
        dispatch_resume(_timer);
    }
    


    使用起来好像也没什么问题

    1. 如果是在UIbutton按钮上面使用GCD进行倒计时的话,会一闪一闪的(有点闪烁的效果)。
    2. 如果不想它闪烁的话,可以在按钮上面添加UILabel来倒数,或者将UIButton的UIButtonType设置为UIButtonTypeCustom

    欢迎关注我的GitHub:点这里哦

    相关文章

      网友评论

          本文标题:iOS-图片的合并(添加水印)+GCD倒计时

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