绘制和创建图像

大多数情况下,使用标准视图显示图像相当简单。但是,有两种情况需要您做额外的工作:

  • 如果要将图像显示为自定义视图的一部分,则必须自己在视图的drawRect:方法中绘制图像。
  • 如果要将图像渲染到屏幕外(以便稍后绘制或保存到文件中),则必须创建位图图像上下文。

绘制图像

为了获得最佳性能,如果使用UIImageView类可以满足图像绘制需求,则应该使用此图像对象来初始化UIImageView对象。 但是,如果您需要明确绘制图像,则可以存储图像并稍后在视图的drawRect:方法中使用它。

// the these draw the image 'right side up' in the usual coordinate system with 'point' being the top-left.
// 这些图像在通常的坐标系中'右侧向上','点'是左上角。  
// UIImage的调用方法:在当前图形上下文中绘制整个图像
- (void)drawAtPoint:(CGPoint)point;                                                        // mode = kCGBlendModeNormal, alpha = 1.0
- (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;
- (void)drawInRect:(CGRect)rect;                                                           // mode = kCGBlendModeNormal, alpha = 1.0
- (void)drawInRect:(CGRect)rect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;

方法[UIImage drawInRect:]:在指定的矩形中绘制整个图像,根据需要对其进行缩放以适合。此方法在当前图形上下文中绘制整个图像,并考虑图像的方向设置。 在默认坐标系中,图像位于指定矩形的原点的右下方。 但是,此方法尊重应用于当前图形上下文的任何转换。此方法使用kCGBlendModeNormal混合模式以完全不透明的方式绘制图像。kCGBlendModeNormal: 正常;也是默认的模式,前景图会覆盖背景图。

使用Bitmap Graphics Contexts生成新的图

大部分时候,绘画的目的是在屏幕上展示。然后有的时候,在离屏缓冲区内绘制是有用的。例如,生成一个现有图片的缩略图,将现有图片绘到一个缓冲区中,将该缓冲区保存到一个文件中。为了支持这些需求:可以创建以为位图上下文(bitmap image context),使用UIKit框架或者 Core Graphics函数在它上面绘制,然后从该位图上下文中获得图片。

// UIImage 上下文
//以下方法只会在DeviceRGB色彩空间中返回每个通道8位的上下文
//鼓励任何新的位图绘图代码使用UIGraphicsImageRenderer (ios 10.0)
UIKIT_EXTERN void     UIGraphicsBeginImageContext(CGSize size);  //生成UIImage 上下文 scale默认为1.0
UIKIT_EXTERN void     UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) NS_AVAILABLE_IOS(4_0);  //生成UIImage 上下文
UIKIT_EXTERN UIImage* __nullable UIGraphicsGetImageFromCurrentImageContext(void);  //从当前Image上下文中获取图片
UIKIT_EXTERN void     UIGraphicsEndImageContext(void);  //从栈中移除该图形上下文

在UIKit中,该流程如下所示:
1)调用UIGraphicsBeginImageContextWithOptions来生成一个bitmap content(位图上下文),将它放入graphics栈中。
第一个参数:size--CGSize类型,指定位图的尺寸。
第二个参数:opaque--BOOL类型,如果你的图片包含透明部分,传NO,否则传YES优化性能。
第三个参数:scale--CGFloat类型, 传递0.0表示根据设备的主屏幕适当缩放,或者传递自己选择的比例因素。

例如,下面的代码片段生成了一个200 * 200像素的bitmap。
(像素个数 = size.width * scaleFactor * size.height * scaleFactor)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);

注意:你应该避免使用UIGraphicsBeginImageContext方法(除非作为fallback或者向后兼容),因为它生成1.0 scale Factor的图片。如果设备为高像素设备,使用UIGraphicsBeginImageContext生成的图片在渲染的时候不会显示很平滑

2)使用UIKit或者Core Graphics将图片的内容绘制到新建的图形上下文中。

3)调用 UIGraphicsGetImageFromCurrentImageContext函数来生成和返回一个你绘制的UIImage的对象。如果愿意,你可以继续绘制和再次调用该方法生成另外的图片。

4)调用UIGraphicsEndImageContext将该上下文从graphics栈中弹出。

例子:生成一个现有图片的缩略图,将现有图片绘到一个缓冲区中,将该缓冲区保存到一个图片中。

- (UIImage *)image:(UIImage *)originalImage withResize:(CGSize)size {
    CGRect imageRect = CGRectMake(0, 0, size.width, size.height);
    UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
    [originalImage drawInRect:imageRect];  //将整张图绘制到指定到矩形内,
    UIImage *image = 
UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 文/茕倚 儿子劝我,妈妈,你不要打电话了,包容一下别人不行吗? 不行,我花了钱,却稀里糊涂签收了不合格的商品,我都...
    春光里one阅读 245评论 0 0
  • 2018年!新的一年,首先祝愿家人朋友幸福安康! 时间真的是很快,转眼间我的宝贝们都长成了大孩子,不再是妈妈怀抱里...
    陈家瀚妈妈阅读 174评论 0 0