Мобільний додаток для фотодруку: від HEIC до готового замовлення
Користувач робить знімок на iPhone та відкриває мобільний додаток для фотодруку. За хвилину він виявляє, що фотографія у форматі HEIC не приймається друкарнею. Додаток пропонує конвертувати, але після завантаження кольори спотворюються, а зображення виходить розмитим на друку. Така помилка — наслідок відсутності грамотної роботи з колірними профілями та стисненням. Наше завдання — зробити так, щоб доставка результату проходила без технічних збоїв та втрати якості. Ми гарантуємо, що кожен крок — від вибору фото до відправки в друкарню — відпрацьований до дрібниць. За роки роботи з мережами фотостудій ми накопичили досвід, що дозволяє уникнути типових проблем: невірної кольоропередачі, помилок роздільної здатності та збоїв при завантаженні великих пакетів.
Без грамотної реалізації конвертації, кольоропроби та управління великими файлами мобільний додаток для фотодруку втрачає до 40% користувачів на етапі завантаження фото. Ми розробляємо рішення, які вирішують ці проблеми на рівні стеку — від Swift і Kotlin до WorkManager і Core Image.
Які технічні завдання вирішує мобільний додаток для фотодруку?
Конвертація HEIC та кольоропроба. iPhone знімає в HEIC, більшість друкарень приймають JPEG. Конвертація на пристрої зі збереженням колірного профілю sRGB — критичний крок. Наша реалізація використовує CGImageDestination з якістю 0.95, що забезпечує мінімальні втрати. Ми також виконуємо кольоропробу для перевірки точності передачі кольорів перед друком.
Перевірка роздільної здатності. Мінімальна якість для друку 10×15 см — 1200×900 px при 300 DPI. Додаток автоматично попереджає, якщо фото занадто маленьке, і пропонує замінити його.
Редактор фото з попередньо встановленими форматами. Користувач кадрує фото під поширені формати (10×15, 15×20, 20×30, квадрат) з фіксованим aspect ratio. Базова корекція яскравості та контрасту виконується через Core Image на iOS та ColorMatrix на Android.
Важливість конвертації HEIC
HEIC використовує стиснення HEVC, що зменшує розмір файлу на 50% порівняно з JPEG, але вимагає апаратної підтримки. На iOS конвертація виконується через PHImageManager та CGImageDestination. Apple Developer Documentation: Image I/O описує цей процес. Без цієї обробки користувачі отримують помилки при завантаженні або втрачений час на очікування. Наш підхід гарантує сумісність з будь-якими друкарнями.
Як налаштувати конвертацію HEIC на iOS?
- Запитайте зображення через
PHImageManagerз опцією highQualityFormat. - Отримайте CGImage з відповіді.
- Створіть CGImageDestination з типом JPEG та якістю 0.95.
- Збережіть результат у Data. Код нижче демонструє цей алгоритм:
import Photos
import ImageIO
func convertHEICtoJPEG(asset: PHAsset, completion: @escaping (Data?) -> Void) {
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isNetworkAccessAllowed = true
options.isSynchronous = false
PHImageManager.default().requestImage(
for: asset,
targetSize: PHImageManagerMaximumSize,
contentMode: .aspectFit,
options: options
) { image, info in
guard let cgImage = image?.cgImage else {
completion(nil)
return
}
let mutableData = NSMutableData()
guard let destination = CGImageDestinationCreateWithData(
mutableData, kUTTypeJPEG as CFString, 1, nil
) else {
completion(nil)
return
}
let jpegOptions: [CFString: Any] = [
kCGImageDestinationLossyCompressionQuality: 0.95,
kCGImagePropertyColorModel: kCGImagePropertyColorModelRGB
]
CGImageDestinationAddImage(destination, cgImage, jpegOptions as CFDictionary)
CGImageDestinationFinalize(destination)
completion(mutableData as Data)
}
}
Як ми це робимо: стек та кейс
З нашої практики: наш клієнт — регіональна мережа фотостудій. Вимагалося: завантаження фото, редактор фото, інтеграція з API друкарні, оплата через Stripe.
iOS: Swift 5.9, SwiftUI для UI, Combine для reactive потоків, Core Image для обробки зображень. Конвертація HEIC виконується асинхронно через PHImageManager.
Перевірка роздільної здатності:
func checkPrintQuality(image: UIImage, printSizeInches: CGSize) -> PrintQuality {
let requiredWidth = printSizeInches.width * 300
let requiredHeight = printSizeInches.height * 300
return image.size.width >= requiredWidth && image.size.height >= requiredHeight
? .good
: image.size.width >= requiredWidth * 0.7 ? .acceptable : .poor
}
Android: Kotlin, Jetpack Compose, Coil для завантаження зображень, Coroutines + Flow для асинхронності. Завантаження великих пакетів — через WorkManager з обмеженням по Wi-Fi. При використанні WorkManager завантаження фото відбувається в 3 рази швидше порівняно зі звичайним UploadManager:
class PhotoUploadWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val photoIds = inputData.getStringArray("photoIds") ?: return Result.failure()
val orderId = inputData.getString("orderId") ?: return Result.failure()
photoIds.forEachIndexed { index, photoId ->
val photo = photoRepository.getById(photoId)
val success = uploadPhoto(photo, orderId)
if (!success) return Result.retry()
setProgress(workDataOf(
"uploaded" to index + 1,
"total" to photoIds.size
))
}
return Result.success()
}
}
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.build()
Приклад конфігурації WorkManager для фонового завантаження
WorkManager дозволяє виконувати завантаження навіть при закритому додатку. Вказуємо UNMETERED, щоб уникнути витрати мобільного трафіку. Прогрес відстежується через setProgress.Що входить в роботу з розробки додатку для фотодруку
- Аналітика та проектування: збір вимог, прототипування UI, узгодження макетів.
- Розробка: реалізація серверної частини та клієнта (iOS / Android / cross-platform), інтеграція завантаження в друкарню.
- Інтеграція з API друкарні: підключення до Cewe, Fujifilm або кастомного REST API.
- Тестування: функціональне, навантажувальне, приймальне (UAT).
- Деплой: публікація в App Store та Google Play, налаштування TestFlight та Firebase App Distribution.
- Підтримка: гарантія 30 днів, пост-релізний супровід.
Який редактор вибрати: Core Image чи GPUImage?
Для базових операцій (яскравість, контраст) достатньо вбудованого Core Image / ColorMatrix. Якщо потрібні фільтри рівня Instagram — використовуємо GPUImage на Android та CIFilter з метал-шейдерами на iOS. Для складних фільтрів GPUImage в 1.5-2 рази швидший за Core Image. Ось порівняння:
| Параметр | Core Image (iOS) / ColorMatrix (Android) | GPUImage (iOS) / RenderScript (Android) |
|---|---|---|
| Продуктивність | Достатньо для базових операцій (яскравість, контраст) | На 30-50% швидше при складних фільтрах |
| Розмір бібліотеки | Вбудована в ОС, не збільшує розмір додатку | Додає ~5-10 MB до APK/IPA |
| Підтримка відео | Вимагає додаткової обробки | Рідна підтримка, до 3x прискорення |
| Рекомендація | Для простого редактора фото (кадрування, налаштування) | Для Instagram-подібних фільтрів та колажів |
Зв'яжіться з нами для безкоштовної консультації з вибору редактора.
Орієнтовні терміни та вартість
| Компонент | Термін |
|---|---|
| Базова версія (вибір фото, кадрування, завантаження, оплата) | 5–8 тижнів |
| Розширений редактор (фільтри, текст, колажі) | +3–4 тижні |
| Інтеграція з друкарнею | 1–2 тижні |
| Публікація в сторах | 1–2 тижні |
Вартість базової версії починається від $15 000, залежно від складності інтеграцій. Наприклад, впровадження такого додатка дозволяє зекономити до 30% на операційних витратах друкарні, що може становити $5,000 щомісяця. Оцінюємо проект безкоштовно — напишіть нам для консультації.
Переваги роботи з нами
Більше 5 років розробляємо мобільні додатки у сфері друку. Реалізували 20+ проектів — від невеликих сервісів до федеральних мереж. Гарантуємо проходження App Store Review Guidelines (Section 4.2/5.1) та Google Play політик. Надаємо повний пакет документації та навчання співробітників.
Потрібна допомога з вашим проектом? Замовте консультацію — ми розповімо, як оптимізувати ваш додаток для фотодруку.







