2014-02-18 68 views
0

我拍了一張照片,然後用這張照片初始化UIImageView對象。唯一的問題是,當我拍攝照片時,使用完整的iPhone屏幕(人像)拍攝照片。使用UIImageView時UIImage失真

使用此照片初始化的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。

我基本上是試圖複製frontback應用程序。這裏是什麼樣子時,你正在服用的原始圖像中的應用,如:

enter image description here

這是我的應用程序的屏幕看起來當你正在服用的圖片,如:

enter image description here

然後,在拍攝照片後,我的應用程序屏幕將變爲看起來像前後屏幕,並拍攝剛剛拍攝的照片並將其放在上半部分,並嘗試縮放它。

我希望這是有道理的。我知道這是一個很長的問題,但我真的想讓用戶在拍攝照片時使用全屏幕,然後將其縮放到屏幕的一半。

我對這一切都錯了嗎?當我最初被拍成「全屏」圖像時,我是否會瘋狂地認爲我可以正確地將圖像縮放到屏幕的一半?

感謝您的幫助。

+0

可能您的imageview大小通過使用ios 7增加了?檢查你的imageview的高度是否與你所認定的一樣? –

回答

1

爲了討論起見,我們假設您拍攝的圖像尺寸是640x1136(是iPhone 5屏幕尺寸的兩倍),並且您試圖在尺寸爲320x284的UIImageView中顯示它(iPhone 5屏幕尺寸的一半)。 正如您已經從這些尺寸中看到的那樣,捕獲的圖像的寬度小於其高度,而寬度大於其高度 - 比例是不同的。

因此,縮放捕捉的圖像以適合UIImageView的寬度(按0.5縮放)意味着捕獲的圖像的尺寸爲320x568,其高度大於UIImageView的高度。 縮放捕捉的圖像以適合UIImageView的高度(按0.25縮放)意味着捕獲的圖像的大小爲160x284,其寬度小於UIImageView的寬度。

圖像不能像您想要的那樣縮放。但是,您可以使用UIViewContentModeScaleAspectFill來填充整個UIImageView,但會丟失一些圖像(圖像的高度太大而不適合)。您也可以選擇使用UIViewContentModeScaleAspectFit這將顯示整個圖像,但會在側面留下一些空間(圖像的寬度太小)。

您擁有的另一個選擇是首先實際上以您的UIImageView的比例捕捉圖像,但這意味着您將無法捕捉到全屏圖像。

+0

我知道它沒有意義..我真的不知道我在期待什麼。它永遠無法完美地縮放。唯一的選擇是以半屏幕大小捕捉原始圖像。謝謝你的幫助嘎。 – user3117509

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; 
} 

我想這就是你想要的。 希望這有助於。

+0

對不起,我是新來的Objective-C和混淆我如何實際輸入您的代碼? 「+」號是什麼令我困惑。它看起來像一個方法實現給我,但我習慣做「 - (void)methodName」。 – user3117509

+0

我需要把「+(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize;」在View Controller的界面區域中,然後將完整的代碼粘貼到實現區域中? – user3117509

+0

ya ...在我的項目中,我希望這個方法是一個類方法,您可以使用「 - 」而不是「+」。 –

0

您提到的圖片佔用了屏幕的全部尺寸。如果它顯示的UIImageView佔據半個屏幕,那麼你就需要添加此代碼以剪裁框

halfView.clipToBounds = YES; 

儘管製作的ImageView的一半大小的屏幕,實際的圖像將顯示外如果imageview的原始大小比aspectFit屬性更大,則它的邊界。 clipToBounds將解決這個問題。

我希望這是你要找的。謝謝,吉姆。

+0

感謝Jim的幫助,但是你的代碼沒有幫助。唯一現實的解決方案是下面提供的一個Gad。 – user3117509