#import "testWatermarkViewController.h"
#define HORIZONTAL_SPACE 30//水平間距
#define VERTICAL_SPACE 50//豎直間距
#define CG_TRANSFORM_ROTATION (M_PI_2 / 3)//旋轉(zhuǎn)角度(正旋45度 || 反旋45度)
@interface testWatermarkViewController ()
@end
@implementation testWatermarkViewController
-(void)test{
? ? NSLog(@"hello");
? ? //1.加載原生圖片
? ? UIImage * draw = [UIImage imageNamed:@"background.png"];
? ? UIImageView * drawView = [[UIImageView alloc]initWithImage:draw];
? ? [drawViewsetFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
? ? [self.view addSubview:drawView];
? ? //2.獲榷迫ⅰ(開啟)一個(gè)位圖上下文搓侄,位圖上下文與view無關(guān)聯(lián),所以不需要在drawRect方法中獲取
? ? // size:位圖上下文的尺寸(新圖片的尺寸)
? ? // opaque: 不透明度 YES:不透明 NO:透明傲醉,通常我們一般都弄透明的上下文
? ? // scale:通常不需要縮放上下文寒匙,取值為0零如,表示不縮放
? ? UIGraphicsBeginImageContextWithOptions(draw.size, NO, 0);
? ? //3.繪制原生圖片
? ? [drawdrawAtPoint:CGPointZero];
? ? NSString *mark = @"waterMark";
? ? //原始image的寬高
? ? CGFloat viewWidth = draw.size.width;
? ? CGFloat viewHeight = draw.size.height;
? ? //為了防止圖片失真,繪制區(qū)域?qū)捀吆驮紙D片寬高一樣
? ? UIGraphicsBeginImageContext(CGSizeMake(viewWidth, viewHeight));
? ? //先將原始image繪制上
? ? [drawdrawInRect:CGRectMake(0, 0, viewWidth, viewHeight)];
? ? //sqrtLength:原始image的對(duì)角線length锄弱。在水印旋轉(zhuǎn)矩陣中只要矩陣的寬高是原始image的對(duì)角線長(zhǎng)度考蕾,無論旋轉(zhuǎn)多少度都不會(huì)有空白。
? ? CGFloat sqrtLength = sqrt(viewWidth*viewWidth + viewHeight*viewHeight);
? ? //4.文字的屬性
? ? NSDictionary *attr = @{
?? ? ? ? ? ? ? ? ? ? ? ? ? //設(shè)置字體大小
?? ? ? ? ? ? ? ? ? ? ? ? ? NSFontAttributeName: [UIFont systemFontOfSize:23],
?? ? ? ? ? ? ? ? ? ? ? ? ? //設(shè)置文字顏色
?? ? ? ? ? ? ? ? ? ? ? ? ? NSForegroundColorAttributeName :[UIColor grayColor],
?? ? ? ? ? ? ? ? ? ? ? ? ? };
? ? NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:mark attributes:attr];
? ? //繪制文字的寬高
? ? CGFloat strWidth = attrStr.size.width;
? ? CGFloat strHeight = attrStr.size.height;
? ? //開始旋轉(zhuǎn)上下文矩陣会宪,繪制水印文字
? ? CGContextRef context = UIGraphicsGetCurrentContext();
? ? //將繪制原點(diǎn)(0辕翰,0)調(diào)整到源image的中心
? ? CGContextConcatCTM(context, CGAffineTransformMakeTranslation(viewWidth/2, viewHeight/2));
? ? //以繪制原點(diǎn)為中心旋轉(zhuǎn)
? ? CGContextConcatCTM(context, CGAffineTransformMakeRotation(CG_TRANSFORM_ROTATION));
? ? //將繪制原點(diǎn)恢復(fù)初始值,保證當(dāng)前context中心和源image的中心處在一個(gè)點(diǎn)(當(dāng)前context已經(jīng)旋轉(zhuǎn)狈谊,所以繪制出的任何layer都是傾斜的)
? ? CGContextConcatCTM(context, CGAffineTransformMakeTranslation(-viewWidth/2, -viewHeight/2));
? ? //計(jì)算需要繪制的列數(shù)和行數(shù)
? ? int horCount = sqrtLength / (strWidth + HORIZONTAL_SPACE) + 1;
? ? int verCount = sqrtLength / (strHeight + VERTICAL_SPACE) + 1;
? ? //此處計(jì)算出需要繪制水印文字的起始點(diǎn)喜命,由于水印區(qū)域要大于圖片區(qū)域所以起點(diǎn)在原有基礎(chǔ)上移
? ? CGFloat orignX = -(sqrtLength-viewWidth)/2;
? ? CGFloat orignY = -(sqrtLength-viewHeight)/2;
? ? //在每列繪制時(shí)X坐標(biāo)疊加
? ? CGFloat tempOrignX = orignX;
? ? //在每行繪制時(shí)Y坐標(biāo)疊加
? ? CGFloat tempOrignY = orignY;
? ? for (int i = 0; i < horCount * verCount; i++) {
? ? ? ? [markdrawInRect:CGRectMake(tempOrignX, tempOrignY, strWidth, strHeight) withAttributes:attr];
? ? ? ? if (i % horCount == 0 && i != 0) {
? ? ? ? ? ? tempOrignX = orignX;
? ? ? ? ? ? tempOrignY += (strHeight +VERTICAL_SPACE);
? ? ? ? }else{
? ? ? ? ? ? tempOrignX += (strWidth +HORIZONTAL_SPACE);
? ? ? ? }
? ? }
? ? //5.獲取之后的圖片
? ? UIImage *finalImg = UIGraphicsGetImageFromCurrentImageContext();
? ? UIImageView *finalImgView = [[UIImageView alloc]initWithImage:finalImg];
? ? [finalImgViewsetFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
? ? [self.view addSubview:finalImgView];
? ? //6.關(guān)閉上下文
? ? UIGraphicsEndImageContext();
? ? CGContextRestoreGState(context);
}
@end