绘制和创建图像

2018-03-13  本文已影响0人  hello_iOS程序媛

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

绘制图像

为了获得最佳性能,如果使用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;
}
上一篇下一篇

猜你喜欢

热点阅读