2014-02-18 2 views
0

Я сделал снимок, а затем инициализирую объект UIImageView с этой фотографией. Единственная проблема заключается в том, что при съемке фотографии выполняется съемка с использованием полного экрана iPhone (портрет).UIImage искажается при использовании UIImageView

UIImageView, который инициализируется этой фотографией, установлен только на верхние 50% экрана iphone. Таким образом, вы можете представить, что изображение выглядит искаженным.

Я был в состоянии сделать это выглядеть намного лучше, используя следующий код:

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 и никогда не может идеально масштабироваться, чтобы соответствовать UIImageView, который занимает только верхние 50% экрана iphone.

Я в основном пытался скопировать приложение frontback. Вот как это выглядит, когда вы принимаете исходное изображение в своем приложении:

enter image description here

Это то, что экран моего приложения выглядит, когда вы принимаете картину:

enter image description here

И затем сразу после того, как вы сделаете снимок, экран моего приложения изменится, чтобы выглядеть как передний экран, и берет фотографию, которую вы только что взяли, и помещает ее в верхнюю половину и пытается ее масштабировать.

Надеюсь, это имеет смысл. Я знаю, что это долгий вопрос, но я просто хотел, чтобы пользователь использовал полный экран, снимая фотографию, а затем просто масштабировал ее до половины экрана.

Я все об этом не так? Я с ума схожу с мыслью, что смогу когда-либо правильно масштабировать изображение до половины экрана, когда оно было первоначально захвачено как «полноэкранный» образ?

Спасибо за помощь.

+0

Возможно, ваш размер изображения будет увеличиваться с помощью ios 7? проверить высоту вашего изображения так же, как и вы? –

ответ

1

Для примера предположим, что размер вашего захваченного изображения составляет 640x1136 (в два раза больше экрана iPhone 5), и вы пытаетесь отобразить его в формате UIImageView размером 320x284 (в половину размера экрана iPhone 5). Как вы уже видите, из этих размеров ширина захваченного изображения меньше его высоты, тогда как ширина UIImageView больше его высоты - пропорции разные.

Таким образом, масштабирование захваченного изображения в соответствии с шириной 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

Извините, я новичок в объективе-c и смущен, как бы я действительно входил в ваш код? Знак «+» - это то, что меня смущает. Это похоже на реализацию метода для меня, но я привык делать «- (void) methodName». – user3117509

+0

Должен ли я поставить «+ (UIImage *) imageWithImage: (UIImage *) image scaledToSize: (CGSize) newSize;" в области интерфейса View Controller, а затем вставьте свой полный код в область реализации? – user3117509

+0

ya ... в моем проекте Я хотел, чтобы этот метод был методом класса, вы можете использовать «-» вместо «+». –

0

Вы упомянули, что изображение занимает весь размер экрана. Если это отобразить UIImageView занимает половину экрана, то вам необходимо добавить этот код для клипа кадра

halfView.clipToBounds = YES; 

Несмотря на создание размера ImageView половины экрана, реальное изображение будет отображаться за пределами границы изображения, если размер оригинала больше с свойством aspectFit. clipToBounds исправит это.

Надеюсь, это то, что вы ищете. Спасибо, Джим.

+0

Спасибо за помощь, Джим, но ваш код не помог. Единственное реалистичное решение - это тот, который предложил Гад ниже. – user3117509

Смежные вопросы