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

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

图片的合并(添加水印)

项目里面有个分享图片到朋友圈的功能。要求是给要分享的图片添加水印。大概就是把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倒计时)