主题
iOS中图片的size和图片像素的关系
正文
最近在做拍照搜题的一个功能,需要接入阿里的切图接口和图片识别文字接口。这里附上阿里的接口文档链接阿里试卷切题接口。
通过这个文档发现阿里对上传的图片尺寸有要求,要求如下:
强调了必须小于8192像素。刚开始以为直接判断UIImage的size,如果宽和高有大于8192的话,做下处理就行了。结果发现不是这样的。UIImage的size的width和height和像素的转换是和手机分辨率有关系的。
例如图片的width是1000,在2倍屏的手机上,他的宽度的像素就是2000,3倍屏的手机上他的宽度的像素就是3000。所以判断图片的像素是否超过某个值,需要乘上设备的scale值。
最开始我是通过UIScreen.main.scale 来获取设备是几倍屏的。后来发现UIImage有个更好用的属性,就是scale属性。通过这个属性可以知道UIImage最新状态下像素和size的关系。
例如我在3倍屏手机上像素超过了8192像素,那么我可以通过Core Graphics的相关方法改变图片的scale,从而减小图片的像素。
比如我的图片的size是3000 X 3000 ,那么在3倍屏的手机上他的像素就是9000 X 9000 pixel。超过了接口规定的值。这里我就可以通过如下方法将图片的scale变为2,从而让图片的像素变为 6000 X 6000 pixel。从而满足接口的相关要求,代码如下:
func changeSizeAndScale(size: CGSize, scale: CGFloat = UIScreen.main.scale) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, scale)
defer {
UIGraphicsEndImageContext()
}
let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
draw(in: rect)
let output = UIGraphicsGetImageFromCurrentImageContext()
return output
}
size传图片本身的size,scale传2。则在不改变图片size的情况下,缩小了图片的像素,满足了接口的要求。
总结
以前对图片的size和像素了解的比较少,这里整理下他们的关系,可以用个公式表示如下:
image.size.width * image.scale = image.像素.width
image.size.height * image.scale = image.像素.height