在做Play+的图片剪切的时候遇到个神坑的问题,同样的剪切数据,同样样子的图,对本地图片的剪切效果就是跟对网络图片的剪切效果不一样,而且大概是iOS9.1左右时候出现的问题。简直百思不得其解,但是这种问题又不算小问题,不可能搁置一边,使劲跟了跟,跟到一个UIImage的神坑。
UIImage有个属性叫做scale(废话),官方文档给的描述是这样的:

@property(nonatomic, readonly) CGFloat scale

Discussion
If you load an image from a file whose name includes the @2x modifier, the scale is set to 2.0. You can also specify an explicit scale factor when initializing an image from a Core Graphics image. All other images are assumed to have a scale factor of 1.0.

If you multiply the logical size of the image (stored in the size property) by the value in this property, you get the dimensions of the image in pixels.

也就是说scale的来源有你从文件名读取的图片名字带@nx的那个n。要么就是从CGImage转换来的自己写的scale。也就是,这个方法:

+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);

仔细看了看文件,跟scale有关的还有这几个方法:

+ (nullable UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale NS_AVAILABLE_IOS(6_0);
+ (UIImage *)imageWithCIImage:(CIImage *)ciImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(6_0);
- (nullable instancetype)initWithData:(NSData *)data scale:(CGFloat)scale NS_AVAILABLE_IOS(6_0);
- (instancetype)initWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);
- (instancetype)initWithCIImage:(CIImage *)ciImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(6_0);

然后,然后在并没有使用这几个跟scale相关方法,奇怪的事情发生了。
从手机相册直接导入的图片的scale如下


就是这张UIImage,上传到7牛服务器,再用SDWebImage下载成为一个新的UIImage的时候,scale变成了这样


这就是导致同样的图片,同样的剪切,但是剪切出来的图片区域不一样的原因了。
但是这个问题为什么会产生呢。