В своем приложении для iPhone я делаю снимок с камеры, затем я хочу изменить его размер до 290 * 390 пикселей. Я использовал этот метод для изменения размера изображения:
UIImage *newImage = [image _imageScaledToSize:CGSizeMake(290, 390)
interpolationQuality:1];
Он отлично работает, но это недокументированная функция, поэтому я больше не могу использовать его с iPhone OS4.
Итак ... какой самый простой способ изменить размер UIImage?
Ответы:
Самый простой способ - установить рамку
UIImageView
и установитьcontentMode
один из параметров изменения размера.Или вы можете использовать этот метод, если вам действительно нужно изменить размер изображения:
Пример использования:
источник
newImage
будет уже автоматически выпущен, и он должен до метода, который вызвал это, чтобы сохранить его или нет. Этот подход просто требует ошибки памяти, посколькуinit
не является частью имени метода. Я ожидал бы, что метод с именем, подобным этому, возвратит автоматически освобожденный объект.UIGraphicsBeginImageContextWithOptions
Вот Swift версия ответа Пола Линча
И как расширение:
источник
Правильное решение Swift 3.0 для iOS 10+ : использование
ImageRenderer
и закрытие синтаксиса:А вот версия Objective-C:
источник
Тревор Ховард имеет несколько категорий UIImage, которые прекрасно справляются с изменением размера. Если ничего другого, вы можете использовать код в качестве примера.
Примечание. Начиная с iOS 5.1 этот ответ может быть недействительным. Смотрите комментарий ниже.
источник
Более компактная версия для Swift 4 и iOS 10+:
Применение:
источник
Я также видел, что это также сделано (который я использую
UIButtons
для нормального и выделенного состояния, поскольку кнопки неresize
подходят). Кредит идет тому, кем был первоначальный автор.Сначала создайте пустой файл .h и .m с именем
UIImageResizing.h
иUIImageResizing.m
Включите этот файл .h в любой файл .m, в котором вы собираетесь использовать функцию, а затем вызовите его так:
источник
Это улучшение кода Пола даст вам четкое изображение высокого разрешения на iPhone с дисплеем сетчатки. В противном случае при уменьшении это размыто.
источник
UIGraphicsBeginImageContextWithOptions
автоматически используется масштаб главного экрана ( начиная с iOS 3.2).Вот простой способ:
resizedImage - это новое изображение.
источник
Быстрое решение для Stretch Fill, Aspect Fill и Aspect Fit
и использовать вы можете сделать следующее:
Спасибо abdullahselek за оригинальное решение.
источник
Вот модификация категории, написанная iWasRobbed выше. Он сохраняет пропорции исходного изображения, а не искажает его.
источник
Если вы просто хотите, чтобы изображение было меньше и не заботились о точном размере:
Установка масштаба
0.25f
даст вам изображение 816 на 612 с 8-мегапиксельной камеры.Вот категория UIImage + Scale для тех, кто в ней нуждается.
источник
Почему так сложно? Я думаю, что с помощью системного API можно добиться того же результата:
Единственное, что нужно, это то, что вы должны передать обратное отношение целей в качестве второго аргумента, так как согласно документу второй параметр указывает отношение исходного изображения к новому масштабированному.
источник
Это расширение UIImage, совместимое с Swift 3 и Swift 4, которое масштабирует изображение до заданного размера с соотношением сторон
Пример использования
источник
scaledImage(with size:)
илиscaledWithSize(_:)
. ИUIGraphicsGetImageFromCurrentImageContext
не может действительно вернутьсяnil
, поэтому!
будет работать так же. Вы также можете упростить создание прямоугольника доCGRect(origin: .zero, size: size)
.Я нашел категорию для UIImage в собственных примерах Apple, которая делает то же самое. Вот ссылка: https://developer.apple.com/library/ios/samplecode/sc2273/Listings/AirDropSample_UIImage_Resize_m.html .
Вам просто нужно изменить вызов:
в
imageWithImage:scaledToSize:inRect:
с:Для того, чтобы рассмотреть альфа-канал на изображении.
источник
источник
Для моих поддерживающих Xamarians, вот версия Xamarin.iOS C # ответа @Paul Lynch.
источник
Если вы хотите сделать миниатюру UIImage (с пропорциональным изменением размера или, возможно, с некоторым обрезанием), проверьте категорию UIImage + Resize, которая позволяет вам использовать краткий, похожий на ImageMagick синтаксис:
источник
[cf Chris] Чтобы изменить размер до желаемого размера:
или, эквивалентно, заменить
CGImageGetWidth(...)/DESIREDWIDTH
источник
Рожерио Чавес ответит как быстрое продолжение
А также бонус
источник
Swift 3.0 с отказоустойчивой опцией (возвращает исходное изображение в случае ошибки):
источник
(Совместимо с Swift 4) Решение для iOS 10+ и iOS <10 (
UIGraphicsImageRenderer
если возможно, используйтеUIGraphicsGetImageFromCurrentImageContext
иначе)источник
Эффективный подход без растяжения изображения Swift 4
// Вызов метода
источник
Ответ @Paul Lynch отличный, но он изменит соотношение изображения. если вы не хотите менять соотношение изображения и хотите, чтобы новое изображение соответствовало новому размеру, попробуйте это.
источник
использовать это расширение
источник
Swift 2.0:
источник
Вот мой несколько многословный код Swift
источник
guard
) кaspectRatioAwareSize
функции, чтобы она не генерировала исключение деления на ноль, если входные параметры для imageSize или boxSizeCGSize.zero
Swift 4 ответ:
источник
The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
Я обнаружил, что трудно найти ответ, который вы можете использовать «из коробки» в своем проекте Swift 3 . Основная проблема других ответов в том, что они не соблюдают альфа-канал изображения. Вот техника, которую я использую в своих проектах.
Пример использования:
Этот код является переписанным расширением Apple с добавленной поддержкой изображений с альфа-каналом и без него.
В качестве дальнейшего чтения я рекомендую проверить эту статью для различных методов изменения размера изображения. Текущий подход предлагает достойную производительность, он работает с высокоуровневыми API и легок для понимания. Я рекомендую придерживаться этого, если вы не обнаружите, что изменение размера изображения является узким местом в вашей работе.
источник
Используйте это расширение, если вам нужно изменить ширину / высоту только с соотношением сторон.
источник