大多数情况下,使用标准视图显示图像相当简单。但是,有两种情况需要您做额外的工作:
- 如果要将图像显示为自定义视图的一部分,则必须自己在视图的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;
}
网友评论