Добавить объявление

Оптимальное создание миниатюр с помощью CGImageSource

Создание миниатюр - одна из самых распространенных задач в мобильной разработке. Но не все методы одинаково эффективны. Рассмотрим, как разные подходы показывают себя на практике при работе с 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 раз по сравнению с классическими методами. Для задач, связанных с отображением галерей или списков изображений, этот подход становится оптимальным выбором.
31.10.2025 7 490