Anti Alias, UIImage и производительность

У меня есть UIImage загруженный в UIImageView . UIImage больше, чем UIImageView и он был уменьшен до соответствия. Очевидно, что уменьшенный UIImage показывает зубчатые края.

Каков наилучший способ сглаживания этого изображения в отношении производительности?

Я видел этот метод с использованием drawInRect но я также читал, что drawInRect не дает лучшую производительность .

Я читал несколько разных статей, и сам пробовал несколько методов. Но после прочтения еще нескольких сообщений о различиях в производительности между использованием UIViews и Core Graphics, мне было интересно, какой метод для сглаживания изображения дает лучшую производительность?

3 Solutions collect form web for “Anti Alias, UIImage и производительность”

Изучите список доступных фильтров основных изображений . В частности, преобразование CILanczosScaleTransform доступное через CILanczosScaleTransform похоже, именно то, что вам нужно. Он должен быть доступен на всех версиях iOS> = 6.0.

Как правило, использование фильтров Core Image будет более эффективным, чем при использовании Core Graphics. Однако я настоятельно рекомендую вам проверить результаты, а также результаты в вашем конкретном случае.

Лучшее решение всегда имеет правильный размер изображения в вашем UIImageView . Однако, если вы не можете иметь правильный размер изображения, и вам нужно его изменить, другое хорошее решение – использовать CoreGraphics для выполнения операции масштабирования изображения вне основного потока.

Начиная с SDK 4.0, операции CoreGraphics являются потокобезопасными , поэтому вы можете поместить все материалы для изменения размера в фоновую очередь и обрабатывать их размер. Как только изменение размера закончится, вы должны назначить обрезанное изображение в своем UIImageView в основном потоке, потому что весь материал UIKit должен быть выполнен в этом потоке. При таком подходе вы не будете блокировать основной поток при каждом изменении размеров изображений.

Как только вы это сделаете, вы также можете кэшировать результаты обрезки во избежание повторного вычисления обрезки (т. Е. Каждый раз, когда вы переходите к одному и тому же UITableViewCell ) и повышаете производительность.

Вы можете реализовать это как категорию UIImage , возьмите мой код в качестве примера:

 - (void)resizeImageWithSize:(CGSize)size cacheKey:(NSString *)cacheKey completionBlock:(void (^)(UIImage *croppedImage))completionBlock { dispatch_async([[self class] sharedBackgroundQueue], ^{ // Check if we have the image cached UIImage *resizedImage = [[[self class] resizedImageCache] objectForKey:cacheKey]; if (nil == resizedImage) { // If not, resize and cache it @autoreleasepool { resizedImage = [self resizeImageWithSize:size]; [[[self class] resizedImageCache] setObject:resizedImage forKey:cacheKey]; } } dispatch_async(dispatch_get_main_queue(), ^{ completionBlock(resizedImage); }); }); } 

Затем реализация resizeImageWithSize: тот, где все вещи CoreGraphics происходят. Вы можете найти интересную библиотеку FXImageView Ник Локвуд, который использует тот же подход: категория UIImageView , имеет кеш размера и использует фоновый поток для работы с Core Graphics.

Поскольку вы спрашивали о Swift в комментариях:

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

Пример:

 // Note: this seamlessly handles both scaling AND caching the scaled image let filter = AspectScaledToFillSizeFilter(size: imageView.frame) imageView.af_setImage(withURL: url, filter: filter) 

Просто убедитесь, что изображениеView.frame установлено заранее (например, вызов layoutIfNeeded() сначала для автозапуска), или он будет утверждать.

  • XCode iOS цвета не совпадают после сборки
  • Как я могу повернуть данные UIImage и изображения по 90 градусам
  • UIImageView contentMode не работает после приложения эффекта размытия
  • Пытаясь подрезать UIImage до соотношения сторон 1: 1 (квадрат), но он продолжает увеличивать изображение, вызывая его размытие. Зачем?
  • Как сделать UIButton кругом?
  • ios - SizeToFit для UIImageView не работает
  • Установка uiimage на nil не освобождает память с помощью ARC
  • Программирование на iPhone: как сделать UIImage в шоу UIImageView в реальном размере?
  • не может изменять кадр UIImageView, если он добавлен через Interface Builder
  • Попытка установить границу UIImage
  • Почему NSData остается nil после загрузки из действительного URL?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.