美文网首页
绘制和创建图像

绘制和创建图像

作者: hello_iOS程序媛 | 来源:发表于2018-03-13 10:50 被阅读0次

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

    • 如果要将图像显示为自定义视图的一部分,则必须自己在视图的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;
    }
    

    相关文章

      网友评论

          本文标题:绘制和创建图像

          本文链接:https://www.haomeiwen.com/subject/cotofftx.html