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

绘制和创建图像

作者: 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;
}

相关文章

  • 绘制和创建图像

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

  • pygame 快速入门

    目标 项目准备 使用 pygame 创建图形窗口 理解 图像 并实现图像绘制 理解 游戏循环 和 游戏时钟 理解 ...

  • Python:飞机大战游戏2:pygame 快速入门

    总体目录 1.1、项目准备 1.2、使用 pygame 创建图形窗口 1.3、理解 图像 并实现图像绘制 1.4...

  • python pygame 快速入门

    pygame 快速入门 目标 项目准备 使用 pygame 创建图形窗口 理解 图像 并实现图像绘制 理解 游戏循...

  • HTML5(九)canvas绘制图像

    一.绘制图像 图片抓取后放在drawImage里面手动创建图片资源 二.自定义填充 三.获得和写入图像数据 获得距...

  • Android 图像绘制之 Drawable

    Android 图像绘制系列文章Android图像绘制之BitmapAndroid 图像绘制之 DrawableA...

  • Android 图像绘制之 Drawable(二)

    Android 图像绘制系列文章Android图像绘制之BitmapAndroid 图像绘制之 DrawableA...

  • OpenGL ES GLSL加载图片

    OpenGL ES需要渲染上下文和绘制表面才能完成图像的绘制。但是OpenGL的API并没有提供如何创建渲染上下文...

  • 性能优化-图像的绘制CGContextRef

    图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的...

  • 13.1.2 使用GD库画图

    13.1.2 使用GD库画图 GD库图像绘制的步骤 在PHP中创建一个图像应该完成如下所示的4个步骤:1.创建一个...

网友评论

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

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