Мое приложение загружает набор файлов изображений из сети и сохраняет их на локальный диск iPhone. Некоторые из этих изображений довольно большие по размеру (например, шириной более 500 пикселей). Поскольку у iPhone даже нет достаточно большого дисплея, чтобы отображать изображение в исходном размере, я планирую изменить размер изображения на что-то меньшее, чтобы сэкономить место / производительность.
Кроме того, некоторые из этих изображений являются изображениями в формате JPEG, и они не сохраняются с обычными настройками качества 60%.
Как изменить размер изображения с помощью iPhone SDK и как изменить настройку качества изображения JPEG?
Самый простой и понятный способ изменить размер изображений - это
источник
Вышеупомянутые методы хорошо работают с небольшими изображениями, но когда вы пытаетесь изменить размер очень большого изображения, у вас быстро заканчивается память и приложение вылетает. Намного лучший способ -
CGImageSourceCreateThumbnailAtIndex
изменить размер изображения без его предварительного декодирования.Если у вас есть путь к изображению, размер которого вы хотите изменить, вы можете использовать это:
Подробнее здесь .
источник
CGImageSource
помимо изображений и PDF-файлов?inSampleSize
что используется в декодере Android. И это единственный ответ, который обеспечивает способ уменьшения изображения с эффективным использованием памяти.Лучший способ масштабировать изображения без потери соотношения сторон (то есть без растяжения изображения) - использовать этот метод:
Добавьте этот метод в свой класс Utility, чтобы вы могли использовать его в своем проекте, и получите к нему доступ следующим образом:
Этот метод заботится о масштабировании при сохранении соотношения сторон. Он также добавляет отступы к изображению в случае, если уменьшенное изображение имеет большую ширину, чем высоту (или наоборот).
источник
Если у вас есть контроль над сервером, я настоятельно рекомендую изменить размер серверной части изображений с помощью ImageMagik . Загрузка больших изображений и изменение их размера на телефон - это трата многих ценных ресурсов - пропускной способности, батареи и памяти. Все это редко встречается в телефонах.
источник
Я разработал идеальное решение для масштабирования изображений в Swift.
Вы можете использовать его для изменения размера изображения для заливки, заливки или соотношения сторон заданного размера.
Вы можете выровнять изображение по центру или по любому из четырех краев и четырех углов.
А также вы можете обрезать дополнительное пространство, которое добавляется, если соотношения сторон исходного изображения и целевого размера не равны.
Ниже приведены примеры применения этого решения.
Серый прямоугольник - это размер изображения целевого сайта. Синие круги в голубом прямоугольнике - это изображение (я использовал круги, потому что их легко увидеть, когда оно масштабировано без сохранения аспекта). Светло-оранжевым цветом отмечены области, которые будут обрезаны, если вы пройдете мимо
trim: true
.Соотношение сторон до и после масштабирования:
Другой пример соотношения сторон :
Соотношение сторон с выравниванием по верху:
Заполнение аспекта :
Заполнить :
Я использовал апскейлинг в своих примерах, потому что это проще продемонстрировать, но решение также работает для уменьшения масштаба, как это было сказано.
Для сжатия JPEG вы должны использовать это:
Вы можете проверить мою суть с помощью игровой площадки Xcode.
источник
Для Swift 3 приведенный ниже код масштабирует изображение с сохранением соотношения сторон. Вы можете узнать больше об ImageContext в документации Apple :
Для его использования вызовите
resizeImage()
метод:источник
вы можете использовать этот код для масштабирования изображения до необходимого размера.
источник
Согласно этой сессии, iOS Memory Deep Dive , нам лучше использовать
ImageIO
для уменьшения изображения.Плохое использование
UIImage
уменьшенных изображений.использование
ImageIO
ImageIO может считывать размеры изображений и информацию метаданных, не загрязняя память.
ImageIO может изменять размер изображений только за счет изменения размера изображения.
Об изображении в памяти
UIGraphicsBeginImageContextWithOptions
всегда используетSRGB
формат рендеринга, который использует 4 байта на пиксель.load -> decode -> render
3 фаз.UIImage
дорого для изменения размера и изменения размераДля следующего изображения, если вы используете,
UIGraphicsBeginImageContextWithOptions
нам нужно всего 590 КБ для загрузки изображения, в то время как нам нужно2048 pixels x 1536 pixels x 4 bytes per pixel
= 10 МБ при декодированииwhile
UIGraphicsImageRenderer
, представленный в iOS 10, автоматически выбирает лучший графический формат в iOS12. Это означает, что вы можете сэкономить 75% памяти, заменивUIGraphicsBeginImageContextWithOptions
наUIGraphicsImageRenderer
, если вам не нужно SRGB.Это моя статья об изображениях iOS в памяти
или
источник
Проблема, которая может возникнуть на дисплеях Retina, заключается в том, что масштаб изображения устанавливается ImageCapture или около того. Приведенные выше функции изменения размера этого не изменят. В этих случаях изменение размера не будет работать должным образом.
В приведенном ниже коде масштаб установлен на 1 (не масштабируется), а возвращаемое изображение имеет ожидаемый размер. Это делается в
UIGraphicsBeginImageContextWithOptions
звонке.источник
Добавляя сюда множество ответов, я выбрал решение, которое изменяет размер по размеру файла, а не по размеру.
Это уменьшит размеры и качество изображения, пока оно не достигнет заданного размера.
Кредит за масштабирование по размеру ответа
источник
Быстрая версия
источник
Я закончил тем, что использовал технику Брэдса, чтобы создать
scaleToFitWidth
метод,UIImage+Extensions
если это кому-то полезно ...тогда где угодно
#import "UIImage+Extensions.h"
UIImage *newImage = [image scaleToFitWidth:100.0f];
Также стоит отметить, что вы можете переместить это ниже в
UIView+Extensions
класс, если хотите визуализировать изображения из UIView.источник
Я просто хотел ответить на этот вопрос программистам Cocoa Swift. Эта функция возвращает NSImage с новым размером. Вы можете использовать эту функцию вот так.
источник
Если ваше изображение находится в каталоге документов, добавьте это расширение URL :
Использование:
Примечание. - Измените <LocalImagePath.jpg> на свой локальный путь к изображению jpg.
источник
Если кто-то все еще ищет лучший вариант
источник
источник
Чтобы изменить размер изображения, у меня есть лучшие (графические) результаты, используя эту функцию вместо DrawInRect:
Соотношение сторон поддерживается автоматически
источник