Создание миниатюр - одна из самых распространенных задач в мобильной разработке. Но не все методы одинаково эффективны. Рассмотрим, как разные подходы показывают себя на практике при работе с 12-мегапиксельным
JPEG.
Классические методы показывают разную производительность:
- NSImage на macOS: 710 мс.
- UIGraphicsImageRenderer на iOS: 210 мс.
- UIImage.prepareThumbnail() на iOS: 130 мс.
Специализированные методы демонстрируют лучшие результаты:
- CGImageSource на macOS: 16-26 мс.
- CGImageSource на iOS: 24-95 мс в зависимости от формата.
Пример использования CGImageSource:
let source = CGImageSourceCreateWithData(imageData as CFData, nil)!
let cgThumb = CGImageSourceCreateThumbnailAtIndex(source, 0, [
kCGImageSourceCreateThumbnailFromImageAlways: true,
kCGImageSourceCreateThumbnailWithTransform: true,
kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height)
] as CFDictionary)!
let thumbnail = UIImage(cgImage: cgThumb) // или NSImage в macOS
Ключевые параметры:
- kCGImageSourceCreateThumbnailFromImageAlways: гарантирует создание миниатюры.
- kCGImageSourceCreateThumbnailWithTransform: учитывает ориентацию изображения.
- kCGImageSourceThumbnailMaxPixelSize: задает максимальный размер.
Получение информации о размерах:
let source = CGImageSourceCreateWithData(data as CFData, nil)!
if let properties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [CFString: Any],
let width = properties[kCGImagePropertyPixelWidth] as? Int,
let height = properties[kCGImagePropertyPixelHeight] as? Int {
print("Ширина: \(width), высота: \(height)")
}
Преимущества CGImageSource:
- Мгновенное получение размеров изображения (2-4 мс).
- Работа с различными форматами (HEIC, JPEG, PNG).
- Эффективное использование памяти.
- Поддержка последовательной загрузки.
Вывод:
CGImageSource показывает стабильно высокую производительность на обеих платформах, особенно заметно ускорение на macOS: до 40 раз по сравнению с классическими методами. Для задач, связанных с отображением галерей или списков изображений, этот подход становится оптимальным выбором.