iOS圖形繪制

圖形繪制在iOS開發(fā)中很常見,處于工作的需要和自身愛好,我就把最近自己使用過的圖形繪制的簡單方式稍微總結(jié)了一下 ,最近沒怎么寫博客了,不足之處大家多多指點(diǎn)

基本繪制

//    UIGraphicsBeginImageContextWithOptions(<#CGSize size#>, <#BOOL opaque#>, <#CGFloat scale#>)方法中各個(gè)參數(shù):
     size :bitmap的大小
     opaque : YES:不透明  NO:透明
     scale: 縮放比例
     創(chuàng)建出來的bitmap就對應(yīng)一個(gè)UIImage
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO , 0);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100));
    CGContextStrokePath(ctx);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    self.aImageView.image = image;
代碼執(zhí)行效果

往往我們還需要把繪制好的圖形保存起來,我們需要先將圖片轉(zhuǎn)換為二進(jìn)制數(shù)據(jù), 然后進(jìn)行保存。

UIImageJPEGRepresentation(<#UIImage * _Nonnull image#>, <#CGFloat compressionQuality#>)
//第一個(gè)參數(shù)是需要保存的圖片對象,第二個(gè)參數(shù)則可以決定我們需要保存圖片的質(zhì)量 一般取 1

//     NSData *data = UIImageJPEGRepresentation(image, 1)
    NSData *data = UIImagePNGRepresentation(image);
   [data writeToFile:@"/Users/apple/XXXXXX.png" atomically:YES];

水印圖片

我們新建一個(gè)繼承UIImage的類,聲明一個(gè)實(shí)現(xiàn)返回一個(gè)帶水印圖片的類方法
.h

#import <UIKit/UIKit.h>
@interface UIImage (LGJImage)
/**
 *  生成水印
 *  @param bgName  背景圖片
 *  @param logNmae 水印圖片
 *  @return 生成好的圖片(帶水印的圖片)
 */
+ (instancetype)imageWithBackgroundImageName:(NSString *)bgName log:(NSString *)logName;
@end

.m

#import "UIImage+LGJImage.h"

@implementation UIImage (LGJImage)
+ (instancetype)imageWithBackgroundImageName:(NSString *)bgName log:(NSString *)logName
{
    UIImage *image = [UIImage imageNamed:bgName];//需要添加水印的圖片
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);//bitmap上下文
    [image drawAtPoint:CGPointMake(0, 0)];    // 繪制背景圖片
    // 繪制水印'
     UIImage *logImage = [UIImage imageNamed:logName];
     CGFloat margin = 10;
     CGFloat logY = margin;
     CGFloat logX = image.size.width - margin - logImage.size.width;
     [logImage drawAtPoint:CGPointMake(logX, logY)];
//    NSString *str = @"我是見哥,我為自己代言";
//    [str drawAtPoint:CGPointMake(150, 50) withAttributes:nil];
    UIImage *newImage =  UIGraphicsGetImageFromCurrentImageContext();
    return newImage;
}
@end

接下來我們在ViewController的viewDidLoad方法中調(diào)用LGJImage的類方法來生成水印圖片

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIImage *newImage =  [UIImage imageWithBackgroundImageName:@"JJ" log:@"JJlog"];
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"lgj.png"];
    NSLog(@"%@", path);
    NSData *data = UIImagePNGRepresentation(newImage);
    [data writeToFile:path atomically:YES];
}
水印圖片

水印文字

    // 0. 加載背景圖片
    UIImage *image = [UIImage imageNamed:@"LGJJJ"];
    
    // 1.創(chuàng)建bitmap上下文
    // 執(zhí)行完這一行在內(nèi)存中就相遇創(chuàng)建了一個(gè)UIImage
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
    // 2.繪圖圖片
    // 2.1繪制背景圖片
    [image drawAtPoint:CGPointMake(0, 0)];
    
    // 2.3繪制文字水印
    NSString *str = @"
";
    [str drawAtPoint:CGPointMake(150, 50) withAttributes:nil];
    // 3.獲得bitmap上下文中繪制好的的圖片
    UIImage *newImage =  UIGraphicsGetImageFromCurrentImageContext();
    // 4.將圖片寫到文件中
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"aaa.png"];
    NSLog(@"%@", path);
    NSData *data = UIImagePNGRepresentation(newImage);
    [data writeToFile:path atomically:YES];

我們打印文件所在的路徑,圖片效果如下:


水印文字

圖片剪切

我們常常會(huì)遇見這樣的場景,截取一張圖片的一部分上傳,作為某個(gè)應(yīng)用的頭像。那么這是怎么實(shí)現(xiàn)的呢?作為程序員我們最關(guān)心什么?代碼實(shí)現(xiàn),來吧兄弟們!
在這里我們自定義一個(gè)集成UIImage的類以及生成截取之后的頭像圖片的方法
.h

@interface UIImage (LGJImage)
/**
 *  生成頭像
 *  @param icon   頭像圖片名稱
 *  @param border 頭像邊框大小
 *  @param color  頭像邊框的顏色
 *  @return 生成好的頭像
 */
+ (instancetype)imageWithIcon:(NSString *)icon border:(NSInteger)border color:(UIColor *)color;
@end

.m

#import "UIImage+LGJImage.h"

@implementation UIImage (LGJImage)

+ (instancetype)imageWithIcon:(NSString *)icon border:(NSInteger)border color:(UIColor *)color
{
    UIImage *image = [UIImage imageNamed:icon];// 加載原有圖片
    // 上下文
    CGFloat margin = border;
    CGSize size = CGSizeMake(image.size.width + margin, image.size.height + margin);
    // YES 不透明 NO 透明
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    // 大圓
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, size.width, size.height));
    [color set];
    CGContextFillPath(ctx);
    // 小圓
    CGFloat smallX = margin * 0.5;
    CGFloat smallY = margin * 0.5;
    CGFloat smallW = image.size.width;
    CGFloat smallH = image.size.height;
    CGContextAddEllipseInRect(ctx, CGRectMake(smallX, smallY, smallW, smallH));
    CGContextClip(ctx);
    [image drawInRect:CGRectMake(smallX, smallY, smallW, smallH)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    return newImage;
}
@end

這樣一來,我們用的時(shí)候就會(huì)方便很多了,只需要調(diào)用此類方法就能達(dá)到截取圖片的效果了

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIImage *newImage = [UIImage imageWithIcon:@"Jiange" border:50 color:[UIColor greenColor]];
    self.VVVVVV.image = newImage;
}

如果需要保存的話可以將圖片保存:例如

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"aaa.png"];
    NSLog(@"%@", path);
    NSData *data = UIImagePNGRepresentation(newImage);
    [data writeToFile:path atomically:YES];

條紋背景

條紋背景的繪制相比于以上很類似,步驟都差不多,我們來具體看一下其實(shí)現(xiàn)過程

    // 1.平鋪圖片
    CGSize size = CGSizeMake(self.view.frame.size.width, 44);
    UIGraphicsBeginImageContextWithOptions(size , NO, 0);
    // 2.畫矩形
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGFloat height = 44;
    CGContextAddRect(ctx, CGRectMake(0, 0, self.view.frame.size.width, height));
    [[UIColor redColor] set];
    CGContextFillPath(ctx);
    // 3.畫線條
    CGFloat lineWidth = 2;
    CGFloat lineY = height - lineWidth;
    CGFloat lineX = 0;
    CGContextMoveToPoint(ctx, lineX, lineY);
    CGContextAddLineToPoint(ctx, self.view.frame.size.width, lineY);
    [[UIColor blackColor] set];
    CGContextStrokePath(ctx);
//獲取到繪制完成后的小圖片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIColor *myColor = [UIColor colorWithPatternImage:image];
    self.XXXXXX.backgroundColor = myColor;

是不是很相似?呵呵 其實(shí)一樣 只需要粘貼復(fù)制之前的代碼,稍作改動(dòng)即可。
好了 時(shí)候不早了。我要開始干活了?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容