Состояние API CGColorSpace и управление цветом на iOS?
В настоящее время я пытаюсь обдумать текущее состояние API-интерфейсов управления цветом CGColorSpace на iOS. До iOS 8.1 SDK (насколько я могу судить) многие функции и константы в CGColorSpace.h
были помечены как __IPHONE_NA
, Тем не менее, в соответствии с iOS 8.1 API Diffs для основной графики многие функции и константы, которые были ранее __IPHONE_NA
были обновлены до __IPHONE_2_0
, Так как мы должны это интерпретировать?
Я не думаю, что Apple задним числом добавила поддержку этих функций в старые версии iOS, скорее они просто изменили видимость этих функций с приватной на публичную. Проблемы возникают при попытке использовать некоторые из этих функций на разных версиях и устройствах iOS. Например:
CGColorSpaceRef sRgb = CGColorSpaceCreateWithName( kCGColorSpaceSRGB ); // kCGColorSpaceSRGB is labeled __IPHONE_8_0
CFDataRef profData = CGColorSpaceCopyICCProfile( ... );
- На iPad Mini (оригинал) под управлением iOS 8.2:
sRgb
&profData
будет NULL. - На iPad 3 под управлением iOS 8.3:
sRgb
&profData
будет NULL. - На iPhone 6 Plus под управлением iOS 9.2.1:
sRgb
будет содержать ненулевойCGColorSpaceRef
,profData
будет содержать ненулевойCFDataRef
буфер. - На iPad Mini (оригинал) под управлением iOS 9.2.1:
sRgb
будет содержать ненулевойCGColorSpaceRef
,profData
будет содержать ненулевойCFDataRef
буфер.
Так что по крайней мере для iOS 8 кажется, что эти функции не полностью реализованы. Для iOS 9 все начинает работать.
Есть ли документация или ресурсы, которые описывают, как эти API изменились в iOS 8 и iOS 9? Какое цветовое пространство следует использовать, когда CGColorSpaceCreateWithName( kCGColorSpaceSRGB )
возвращает NULL? Это похоже на CGColorSpaceCreateDeviceRGB()
может быть единственным вариантом в этом случае.
После некоторого тестирования я обнаружил, что можно получить встроенный цветовой профиль из CGImageRef
и используйте этот профиль, чтобы применить цветовое преобразование к другому цветовому пространству, если вы выполняете цветовое преобразование самостоятельно. API-интерфейсы Core Graphics по-прежнему не поддерживают преобразование изображений между цветовыми пространствами, но если у вас есть свои собственные функции управления цветом, теперь можно сделать это самостоятельно на iOS - что раньше было невозможно.
Я просто хотел бы знать, что работает, а что нет. Я пробовал просматривать заметки о выпуске и технические заметки, в которых описывается, что изменилось с iOS 7 на 8 и с 8 на 9, но я не смог найти ничего, что описывает изменения API CGColorSpace. Кто-нибудь знает, есть ли такие документы?
2 ответа
Ваши выводы верны - до iOS 9, ColorSync/CGColorSpace
не был поддержан; предполагается, что все ресурсы изображения находятся в цветовом пространстве sRGB устройства (документация для CGColorSpace
используется для указания "iOS не поддерживает ColorSync, поэтому все ресурсы должны быть предоставлены в цветовом пространстве собственного устройства: sRGB").
Так что даже если CGColorSpace
/CGColorSpaceRef
существовал в более ранних выпусках, он ничего не делал до iOS 9.0.
Итак, у вас есть несколько вариантов:
- Поддерживается только iOS 9 или новее.
- Используйте правильное отображение цветового пространства на iOS 9+; Пользователи iOS 8 просто получат менее точную цветопередачу изображения.
- Используйте стороннюю библиотеку, как предложила @SumitKumarSaha.
Стоит также отметить, что рендеринг с точным цветовым пространством стал более значительным в прошлом году - iPad Pro 9,7" (2016), iPad Pro 10,5" & 12,9" (2017), iPhone 7 & 7 Plus (2016)), и все новые модели в этих продуктовых линейках используют широкое цветовое пространство Display P3 (на основе DCI P3).
Больше информации на WWDC 2015 Session 510 - Что нового в Core Image.
Вы можете взглянуть на библиотеку с открытым исходным кодом под названием little-CMS. Это дает хорошие результаты, которые вы можете интегрировать в свое приложение.