试图裁剪我的UIImage 1:1纵横比(正方形),但它不断扩大图像造成它模糊。 为什么?

鉴于UIImage,我试图把它变成一个正方形。 只是切断一些最大的尺寸,使其纵横比为1:1。

UIImage *pic = [UIImage imageNamed:@"pic"]; CGFloat originalWidth = pic.size.width; CGFloat originalHeight = pic.size.height; float smallestDimension = fminf(originalWidth, originalHeight); CGRect square = CGRectMake(0, 0, smallestDimension, smallestDimension); CGImageRef imageRef = CGImageCreateWithImageInRect([pic CGImage], square); UIImage *squareImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); UIImageView *imageView = [[UIImageView alloc] initWithImage:squareImage]; imageView.frame = CGRectMake(100, 100, imageView.bounds.size.width, imageView.bounds.size.height); [self.view addSubview:imageView]; 

但这是它的结果:

在这里输入图像说明

当它看起来像这样,但只是一个窄一点。

在这里输入图像说明

为什么是这样? 图片是pic (150×114)/ pic@2x (300×228)。

问题是你在混合逻辑和像素大小。 在非视网膜设备上,这两个是相同的,但在视网膜设备(就像你的情况),像素大小实际上是逻辑大小的两倍。

通常,在deviseGUI时,您总是可以考虑逻辑大小和坐标,而iOS(或OS X)将确保在视网膜屏幕上的所有内容都翻倍。 但是,在某些情况下,特别是在自己创build图像时,必须明确指定您的大小。

UIImagesize方法返回逻辑大小。 例如,这是非视网膜屏幕上的决议。 这就是为什么CGImageCreateWithImageInRect只会从图像的左上angular创build一个新的图像。

将您的逻辑大小乘以图像的比例(非视网膜设备上1个,视网膜设备上2个):

 CGFloat originalWidth = pic.size.width * pic.scale; CGFloat originalHeight = pic.size.height * pic.scale; 

这将确保新图像是从原始图像的全高(或宽度)创build的。 现在,剩下的一个问题是,当你创build一个新的UIImage使用

 UIImage *squareImage = [UIImage imageWithCGImage:imageRef]; 

iOS会认为,这是一个普通的,非视网膜的图像,它会显示两倍大,你所期望的。 要解决这个问题,你必须在创buildUIImage时指定比例:

 UIImage *squareImage = [UIImage imageWithCGImage:imageRef scale:pic.scale orientation:pic.imageOrientation];