将 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

将 UIImage 传递给 SubView 的 UIImageView?

iOS UI基础控件之UIImageView

修剪 UIImageView 以适应内容

避免在我的 UIImageView 中拉伸 UIImage

避免在UIImageView中拉伸UIImage