Как мне найти профили отображения теперь, когда все в ColorSync Manager API устарело

Я обновляю приложение OS X, которое использует API ColorSync Manager для получения цветовых профилей для подключенных дисплеев. Надпись была на стене около OS X 10.6, когда все в API было помечено как устаревшее. Долгое время еще можно было #include <ColorSyncDeprecated.h>, но в самых последних SDK это уже невозможно.

Приложение уже использует Little CMS для фактического управления цветовыми пространствами, так что мне не нужно много. Как я уже отмечал выше, единственное, для чего он использует ColorSync, — это получение профиля основного дисплея с помощью CMGetSystemProfile и NCMGetProfileLocation.

Есть пара вопросов, которые несколько связаны с этим, но им уже несколько лет, и они не решают проблему:

Есть ли сейчас какая-либо альтернатива этому в какой-либо OS X Framework, или Apple просто решила, что никто никогда не должен знать профиль своего дисплея?


person Tim Ruddick    schedule 20.03.2015    source источник


Ответы (4)


The new ColorSync API is defined in
/System/Library/Frameworks/ApplicationServices.framework/Frameworks/ColorSync.framework/Headers

in
    ColorSync.h
    ColorSyncBase.h
    ColorSyncCMM.h
    ColorSyncDeprecated.h
    ColorSyncDevice.h
    ColorSyncProfile.h
    ColorSyncTransform.h

and wasn't documented anywhere by Apple the last time I looked.

Кажется, они забыли объявить

CFUUIDRef CGDisplayCreateUUIDFromDisplayID (uint32_t displayID);

также.

Я не нашел никаких средств для определения местоположения профилей с использованием текущих API OS X, поэтому мне пришлось их жестко закодировать:

#define COLORSYNC_DIR_NETWORK   "/Network/Library/ColorSync/Profiles/"
#define COLORSYNC_DIR_SYSTEM    "/System/Library/ColorSync/Profiles/"
#define COLORSYNC_DIR_LOCAL     "/Library/ColorSync/Profiles/"
#define COLORSYNC_DIR_USER      "/Library/ColorSync/Profiles/"
person Graeme Gill    schedule 23.09.2015

Вы можете использовать CoreGraphice API

colorSpace = ::CGDisplayCopyColorSpace(::CGMainDisplayID());

затем с помощью API нравится:

CGColorSpaceCopyICCData    

вы можете сделать некоторые вещи синхронизации цвета. Я думаю, что это, скорее всего, то, что вы хотите сделать со старым API ColorSync.

person joseph.smeng    schedule 14.08.2017
comment
Выглядит многообещающе — спасибо! У меня больше нет Xcode на Mac, чтобы попробовать. Я поддержу ваш ответ прямо сейчас и приму его, когда у меня будет возможность подтвердить, что он работает. - person Tim Ruddick; 18.08.2017

Текущие страницы документации Apple не помечают ColorSync Manager как устаревшее. Некоторые типы данных и методы есть, но у большей части нет такого указания. Возможно, это было «предварительно»?

страницы ColorSync Manager

person benwiggy    schedule 26.03.2018

Это то, что я делаю, чтобы получить путь к профилю для известного идентификатора прямого отображения.

  1. включить новый фреймворк ColorSync, поскольку с версии 10.13 его больше нет в ApplicationServices
  2. преобразовать идентификатор дисплея в UUID с помощью CGDisplayCreateUUIDFromDisplayID
  3. вызов ColorSyncIterateDeviceProfiles с обратным вызовом
  4. обратный вызов будет вызываться для каждого устройства, и вы получите словарь в качестве параметра с информацией об устройстве, UUID, URL, имени, ...
  5. Я сравниваю свой UUID с UUID в словаре, если я нашел совпадение, я копирую URL из словаря и возвращаю false, чтобы остановить итерацию, если нет, я возвращаю true, чтобы получить обратный вызов для следующего устройства
person H. Al-Amri    schedule 26.01.2018