将UIImage用于UIImageView时,UIImage会失真

时间:2014-02-18 05:52:23

标签: ios iphone objective-c uiimageview uiimage

我拍了一张照片,然后我用这张照片初始化了一个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;

唯一的问题是,最终的UIImageView称为" halfView"仍然有点扭曲。

我有一种感觉,这是不可能解决的,因为原始照片是用完整的iPhone屏幕拍摄的,并且永远不能完美地缩放以适应仅占用iphone屏幕前50%的UIImageView。

我基本上是在尝试复制前端应用。以下是您在应用中拍摄原始图像时的样子:

enter image description here

这是我的应用程序的屏幕在您拍照时的样子:

enter image description here

然后在您拍摄照片后,我的应用程序屏幕会变为看起来像前脸屏幕并拍摄您刚拍摄的照片并将其放在上半部分并尝试缩放它。

我希望这是有道理的。我知道这是一个很长的问题,但我真的想让用户在拍照时使用全屏,然后将其缩放到屏幕的一半。

我是否认为这一切都错了?我疯狂地认为,当它最初被捕获为全屏幕时,我可以将图像正确地缩放到屏幕的一半。图像?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

为了说明,我们假设您捕获的图像尺寸为640x1136(iPhone 5屏幕尺寸的两倍),并且您试图将其显示在尺寸为320x284 {(尺寸的一半)的UIImageView中iPhone 5屏幕)。 正如您已经从这些尺寸中看到的那样,捕获图像的宽度小于其高度,而UIImageView的宽度大于其高度 - 比例不同。

因此,缩放捕获的图像以适合UIImageView的宽度(缩放0.5)意味着捕获的图像大小为320x568 - 其高度大于UIImageView的高度。 缩放捕获的图像以适合UIImageView的高度(缩放0.25)意​​味着捕获的图像大小为160x284 - 其宽度小于UIImageView的宽度。

图像无法像您希望的那样进行缩放。但是,您可以使用UIViewContentModeScaleAspectFill填充整个UIImageView,但会丢失部分图片(图片的高度太大,不适合)。您也可以选择使用UIViewContentModeScaleAspectFit来显示整个图像,但会在侧面留下一些空间(图像的宽度太小)。

您拥有的另一个选择是首先以UIImageView的比例实际拍摄图像,但这意味着您将无法捕捉全屏图像。

答案 1 :(得分:0)

尝试此功能,将此功能中的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;
}

我想这就是你想要的。 希望这会有所帮助。

答案 2 :(得分:0)

你提到图像占据了屏幕的全部大小。如果显示UIImageView占据屏幕的一半,那么你需要添加这段代码来剪辑框架

halfView.clipToBounds = YES;

尽管将图像视图的大小设置为屏幕的一半,但如果使用aspectFit属性的原始大小更大,则实际图像将显示在图像视图的边界之外。 clipToBounds将解决此问题。

我希望这就是你要找的东西。谢谢,吉姆。