代码改变世界

iOS的截屏,图片截取以及pixel,point,scale的研究

2015-08-07 13:49  唐不坏  阅读(1663)  评论(0)    收藏  举报

pixel & point

首先要理解iOS中的像素(pixel)和点(point)点区别。在iphone4之前,

    1 point = 1 pixel

这里有个dpi(dot per inch),即每英尺点的个数,里面的dot和point的意思应该是一致的。

缩放因子(scale)

在iphone4之后出现Retina屏,1个point是4个像素矩阵,横、纵向方向像素密度都被放大到2倍。
下面是iPhone各种型号的尺寸规格:

设备iPhone 逻辑分辨率(point) Scale Factor 设备分辨率(pixel) PPI
3GS 320x480 @1x 320x480 163
4(s) 320x480 @2x 640x960 326
5c 320x568 @2x 640x1136 326
5(s) 320x568 @2x 640x1136 326
6 375x667 @2x 750x1334 326
6+ 414x736 @3x 1080x1920 401

4s在同样的逻辑坐标系下(320x480):

    1 point = scale^2*pixel

其中的scale是缩放因子,通过上表可以看到各种型号的缩放因子。4(s)的缩放因子为2,因此横、纵向方向像素密度都被放大到2倍,1个point代表4个像素点。
iPhone的scale值可以通过以下任一方法获取:

    (CGFloat)[[UIScreen mainScreen] scale]
    (CGFloat)[[UIScreen mainScreen] nativeScale]

图片截取

这里来看一段代码:

    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.0);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

这段代码用来获取当前手机完整截图
其中

    void UIGraphicsBeginImageContextWithOptions (CGSize size,BOOL opaque,CGFloat scale);

方法创建一个基于位图的图形上下文。其中第三个参数与scale有关。设置为0将自动获取当前手机的scale值。
如果手机的scale为2,而你设置为1的话,你会看到截取的图片比较模糊。

再看一段代码

    float scale = [[UIScreen mainScreen] scale]; 
    CGRect myImageRect = CGRectMake(0, 124*scale, W*scale, H*scale);
    CGImageRef imageRef = originImage.CGImage;
    CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, myImageRect);

该段代码实现从originImage(UIImage类型)中截取部分。注意这里的myImageRect使用的是设备分辨率,因此获取的屏幕宽高(逻辑分辨率)需乘以缩放因子