CodeV

3.5-为图像添加水印

水印是常见的图像绘制请求。最初,水印是纸张中用于识别纸张来源的微弱印记。今天的文字水印使用则不同,它们是在图像上添加的,以防止复制和重复使用,或者用于特定的标志或来源标记材料。

清单3-5展示了如何创建简单文本水印,如图3-5所示,水印只不过是绘制图像,然后在该图像上绘制别的东西 - 字符串,标志或符号,然后检索生成新版本图像。

图3-5

图3-5文本水印将图像与字,标志或符号重叠。Public domain images courtesy of the National Park Service

清单3-5中的示例在图像源对角线上绘制字符串(“watermark”)。它通过将上下文旋转45度来实现,使用混合模式高亮水印,同时保留原始照片的详细信息。因为此列表特定于iOS 7,所以在绘制字符串时必须包含文本颜色以及字体属性。如果你没有,字符串将不可见,你会像我在更新这个例子时一样抓耳挠头。

其他常见的方法是使用具有中等alpha水平(半透明)的漫反射白色覆盖,并且仅将标志的阴影(不绘制标志本身)绘制到图像的某部分上。路径剪切有助于后一种方法实现,它在第5章中有更详细的讨论。

每个水印方法以不同的方式改变原始图像。随着图像数据的改变或遮挡,去除水印变得更加困难。

清单3-5对图像添加水印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();

// Draw the original image into the context
CGRect targetRect = SizeMakeRect(targetSize);
UIImage *sourceImage = [UIImage imageNamed:@"pronghorn.jpg"];
CGRect imgRect = RectByFillingRect(SizeMakeRect(sourceImage.size), targetRect);
[sourceImage drawInRect:imgRect];

// Rotate the context
CGPoint center = RectGetCenter(targetRect);
CGContextTranslateCTM(context, center.x, center.y);
CGContextRotateCTM(context, M_PI_4);
CGContextTranslateCTM(context, -center.x, -center.y);

// Create a string
NSString *watermark = @"watermark";
UIFont *font = [UIFont fontWithName:@"HelveticaNeue" size:48];
CGSize size = [watermark sizeWithAttributes:@{NSFontAttributeName: font}];
CGRect stringRect = RectCenteredInRect(SizeMakeRect(size), targetRect);

// Draw the string, using a blend mode
CGContextSetBlendMode(context, kCGBlendModeDifference);
[watermark drawInRect:stringRect withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor whiteColor]}];

// Retrieve the new image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;

本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。