UIImage.size的坑

Posted 张驰小方块

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIImage.size的坑相关的知识,希望对你有一定的参考价值。

有的时候,我们做一些图片的操作。会用到UIImage.size.width,和UIImage.size.height作为宽高进行计算。

然而会出现一些意想不到的情况。比如下面这个例子:

clothing.png 510*628

代码:

UIImage *image = [UIImage imageNamed:@"clothing.png"];
UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:[UIScreen mainScreen].scale orientation:image.imageOrientation];
CGImageRef imageref = CGImageCreateWithImageInRect([scaledImage CGImage], CGRectMake(0, 0, scaledImage.size.width, scaledImage.size.height));
self.imageview2.image = [UIImage imageWithCGImage:imageref];

在iphone6p上运行这段代码,然后imageview2显示的内容是下面这个样子:

只显示出了左上角的一小部分。

why???

通过这个代码,你可能一下就能意识到问题在哪,就是因为这段代码:

UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:[UIScreen mainScreen].scale orientation:image.imageOrientation];

这里传递的scale是当前手机屏幕的点分辨率,iphone6p是3,所以这样得到的UIImage的size的width和height其实都是真实大小除以3。

我们查看UIImage的size属性官方文档也说了:

This value reflects the logical size of the image and takes the image’s current orientation into account. Multiply the size values by the value in the scale property to get the pixel dimensions of the image.

size是逻辑大小,真实的bitmap大小要用UIImage.size.width * UIImage.scale以及 UIImage.size.height * UIImage.scale。

或者直接使用bitmap的宽高:

CGFloat rwidth = CGImageGetWidth([scaledImage CGImage]);
CGFloat rheight = CGImageGetWidth([scaledImage CGImage]);

这里,我们直接看到UIImage的创建方式是initWithCGImage并且传递了scale为3,所以能够知道width和height是不准确的,但是实际应用中,你拿到一个UIImage,可能来自别人的模块,可能来自第三方库(比如SDWebImage)。所以如果需要使用UIImage的bitmap大小(也就是真实大小)的时候,并且不确定该UIImage是怎么创建的,一定要使用以下两种方式:

image.size.width * image.scale
image.size.height * image.scale

以及

CGFloat rwidth = CGImageGetWidth([scaledImage CGImage]);
CGFloat rheight = CGImageGetWidth([scaledImage CGImage]);

 

以上是关于UIImage.size的坑的主要内容,如果未能解决你的问题,请参考以下文章

如何用ffmpeg截取视频片段&截取时间不准确的坑

Blender制作多个动画片段时踩的坑

[JS]应用splice删除多元素时出现的坑

微服务设计指导-feignclient的compression参数导致报文返回为gzip格式带来的坑

python appium server代码调起和关闭遇到的坑

mac idea 代码自动提示的坑。