iOS CIImage растягивает изображение

Несмотря на то, что я установил свой imageView как aspectFit, кажется, что изображение, созданное с помощью CIImage, всегда будет масштабироваться для заполнения.

Простой пример загрузки изображения двумя способами:

// 1. load directly via UIImage
UIImage *imageByUIImage = [UIImage imageNamed:@"Megan-Fox-Look.jpg"];
self.uiImageView.image = imageByUIImage;

// 2. load via CIImage
NSString *filePath =
[[NSBundle mainBundle] pathForResource:@"Megan-Fox-Look" ofType:@"jpg"];
CIImage *ciImage =
[CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
UIImage *imageByCIImage = [UIImage imageWithCIImage:ciImage scale:1.f orientation:UIImageOrientationUp];
self.ciImageView.image = imageByCIImage;

2 представления изображений (uiImageView и ciImageView) имеют одинаковый атрибут «aspectFit» и одинаковые ограничения размера (200x200). Но только (1) правильно отображать изображение, (2) растягивать изображение.

В чем проблема? Спасибо.

Я создаю свой проект Xcode 6.2

введите здесь описание изображения


person vietstone    schedule 25.03.2015    source источник
comment
Не беспокойтесь об этом. Она выглядит довольно хорошо в любом случае.   -  person clearlight    schedule 25.03.2015
comment
Пробовали ли вы изменить свойство size.height изображения после создания UIImage? Я понимаю, что это не ответ, но это обходной путь?   -  person clearlight    schedule 25.03.2015
comment
Попробуйте указать ограничение по высоте для вашего изображения. Взгляните на этот вопрос: stackoverflow.com/questions/16135216/   -  person atulkhatri    schedule 25.03.2015
comment
@atulkhatri мой вид изображения уже имеет ограничение по высоте   -  person vietstone    schedule 25.03.2015
comment
@ 1sand0s Оба изображения имеют одинаковый размер 1280x779 при отладке.   -  person vietstone    schedule 25.03.2015


Ответы (2)


Попробуйте загрузить через CIImage:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"abcd" ofType:@"png"];
CIImage *ciImage = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
UIImage *imageByCIImage = [UIImage imageWithCIImage:ciImage scale:1.0f orientation:UIImageOrientationUp];

UIGraphicsBeginImageContext(imageByCIImage.size);
[imageByCIImage drawInRect:CGRectMake(0,0,imageByCIImage.size.width,imageByCIImage.size.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
self.imageview.image = newImage;
UIGraphicsEndImageContext();
person atulkhatri    schedule 25.03.2015

В документах CIImage указано, что

Хотя объект CIImage имеет связанные с ним данные изображения, он не является изображением.

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

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

UIImage(cgImage: self.context.createCGImage(outputImage, from: outputImage.extent)!)
person lazi74    schedule 20.03.2019