随着Iphone、Ipad的日渐流行,IOS开发早已深入人心,很多开发者开始投入IOS开发。IOS开发或许将在国内掀起一股热潮,对于热衷于各种新技术的我,显然也忍不住想要看看IOS开发到底为何物,看看Objective-C到底神奇在哪里,Cocoa&Cocoa Touch是否真的如此强大。
于是,不久前我也开始涉足到IOS开发的热浪之中。了解了一些基础知识,譬如:OC语法格式、事件模型、窗口、视图、导航等等,今天突然想到了一个有趣的东西,为图片添加个性化的水印,这个水印也许是一个网站的logo,也许是一个公仔,也许是你精心设计的带有某种寓意的图标。所以,我开始查找资料,尝试做起demo来了,好了废话不多说,先看一个效果图。
看似简单,其实不然。下面我就跟大家分享下我做这个demo中遇到的一些坑,相信对于和我一样的IOS开发初学者一定会有帮助。
首先,我最初采用的一种方式,是使用 CGBitmapContextCreate 创建 context ,然后使用 CGContextSelectFont 设置字体和字号,最后使用 CGContextShowTextAtPoint 将水印合成到上下文,再调用 CGBitmapContextCreateImage(context) 生成新的图片。这一切看似顺理成章,最终效果也确实实现了,但是当我输入中文的时候,问题出现了,不用多说大家应该已经才到了,令人头痛的乱码出现了。于是我开始改编码,改字体,各种改,最终还是无果。无奈又开始翻查各种资料,最终让我发现原来 CGContextShowTextAtPoint 方法本就不支持中文输出。至此,本以为已经大功告成,却不得不从头再来!
既然上面的方法已经不能得到我想要的结果,我也只好另寻他法。不得不说如今的互联网真的非常强大,很快我就搜索到了另外的实现方式,于是我又开始动起手来。这次的实现方式是:首先使用 UIGraphicsBeginImageContext(CGSize) 创建图片上下文,然后:
[UIImage drawInRect:CGRect];
绘制主图片,接着:
[NSString drawInRect:CGRect withFont:UIFont];
绘制水印文字,在这里还可以使用:
[[UIColor redColor] set];
设置水印文字 颜色,如果想绘制图片水印,这里改用前面绘制主图的方式有效。接下来使用:
UIImage *aimg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
生成新图片,关闭上下文。皇天不负有心人,这次终于一切正常了。下面贴一下主要代码:
- (UIImage *) addText:(UIImage *)img text:(NSString *)mark {
int w = img.size.width;
int h = img.size.height;
UIGraphicsBeginImageContext(img.size);
[[UIColor redColor] set];
[img drawInRect:CGRectMake(0, 0, w, h)];
[mark drawInRect:CGRectMake(10, 55, 130, 80) withFont:[UIFont systemFontOfSize:18]];
UIImage *aimg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return aimg;