将 UIImage 用于 UIImageView 时 UIImage 失真
Posted
技术标签:
【中文标题】将 UIImage 用于 UIImageView 时 UIImage 失真【英文标题】:UIImage distorted when using it for UIImageView 【发布时间】:2014-02-18 05:52:23 【问题描述】:我拍了一张照片,然后我用这张照片初始化了一个 UIImageView 对象。唯一的问题是,当我拍照时,正在使用 iPhone 全屏(人像)拍照。
使用这张照片初始化的 UIImageView 仅设置为占据 iphone 屏幕的前 50%。所以你可以想象图像看起来是扭曲的。
通过使用以下代码,我已经使它看起来好多了:
UIImageView *halfView = [[UIImageView alloc]initWithImage:image];
[self.view addSubview:halfView];
halfView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.frame.size.height/2);
halfView.contentMode = UIViewContentModeScaleAspectFill;
唯一的问题是,最终名为“halfView”的 UIImageView 仍然有些失真。
我有一种无法解决的感觉,因为原始照片是在整个 iphone 屏幕上拍摄的,并且永远无法完美地缩放以适应仅占 iphone 屏幕顶部 50% 的 UIImageView。
我基本上是在尝试复制前端应用程序。这是您在他们的应用中拍摄原始图像时的样子:
这是您拍照时我的应用程序屏幕的样子:
然后在你拍完照片后,我的应用程序的屏幕会变成看起来像正面的屏幕,并拍摄你刚刚拍摄的照片并将其放在上半部分并尝试对其进行缩放。
我希望这是有道理的。我知道这是一个很长的问题,但我真的想让用户在拍照时使用全屏,然后将其缩放到屏幕的一半。
我做错了吗?当它最初被捕获为“全屏”图像时,我是否可以正确地将图像缩放到屏幕的一半?
感谢您的帮助。
【问题讨论】:
可能您的图像视图大小通过使用 ios 7 得到增加?检查你的 imageview 的高度是否和你想象的一样? 【参考方案1】:为了争论,假设您捕获的图像尺寸为 640x1136(iPhone 5 屏幕尺寸的两倍),并且您尝试在尺寸为 320x284(iPhone 5 尺寸的一半)的UIImageView
中显示它屏幕)。
正如您已经从这些尺寸中看到的那样,捕获的图像的宽度小于其高度,而 UIImageView
的宽度大于其高度 - 比例不同。
因此,缩放捕获的图像以适应 UIImageView
的宽度(缩放 0.5)意味着捕获的图像大小为 320x568 - 它的高度大于 UIImageView
的高度。
缩放捕获的图像以适应 UIImageView
的高度(缩放 0.25)意味着捕获的图像大小为 160x284 - 它的宽度小于 UIImageView
的宽度。
图像无法完全按照您希望的方式缩放。但是,您可以使用UIViewContentModeScaleAspectFill
填充整个UIImageView
,但会丢失一些图像(图像的高度太大而无法容纳)。您也可以选择使用UIViewContentModeScaleAspectFit
,它将显示整个图像,但会在两侧留出一些空间(图像的宽度太小)。
您的另一个选择是首先以UIImageView
的比例实际捕获图像,但这意味着您将无法捕获全屏图像。
【讨论】:
我知道这没有意义。我真的不知道我在期待什么。它永远无法像那样完美地扩展。唯一的选择是以半屏幕大小捕获原始图像。感谢加德的帮助。【参考方案2】:试试这个函数,在这个函数中传递你的UIImage
和新的size
,然后它会返回你指定大小的UIImage
。
- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
我想这就是你想要的。 希望这会有所帮助。
【讨论】:
抱歉,我是 Objective-c 的新手,很困惑我将如何实际输入您的代码? “+”号让我感到困惑。对我来说它看起来像是一个方法实现,但我习惯于做“-(void)methodName”。 我需要把“+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize;”在 View Controller 的界面区域,然后将您的完整代码粘贴到实现区域? ya...在我的项目中,我希望这个方法是一个类方法,你可以使用“-”而不是“+”。 检查更新的答案,让我知道这是否适合您。 如果你在同一个控制器中访问这个方法,那么你不需要把它放在接口区域。但是如果你想从其他类或视图控制器访问这个方法,那么你需要在 .h 文件接口中声明。【参考方案3】:您提到图像占据了整个屏幕。如果要显示占据半屏的 UIImageView,那么你需要添加这段代码来剪辑框架
halfView.clipToBounds = YES;
尽管将 imageview 的大小设置为屏幕的一半,但如果使用 aspectFit 属性的原始尺寸更大,实际图像将显示在 imageview 的边界之外。 clipToBounds 将解决此问题。
我希望这是您正在寻找的。谢谢,吉姆。
【讨论】:
感谢 Jim 的帮助,但您的代码没有帮助。唯一现实的解决方案是下面提供的 Gad。以上是关于将 UIImage 用于 UIImageView 时 UIImage 失真的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView 不显示从通知中获取的 UIImage