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使用的是设备分辨率,因此获取的屏幕宽高(逻辑分辨率)需乘以缩放因子
浙公网安备 33010602011771号