试图裁剪我的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图像时,必须明确指定您的大小。
UIImage
的size
方法返回逻辑大小。 例如,这是非视网膜屏幕上的决议。 这就是为什么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];