问题描述
我正在尝试从 Qt 环境中获取自定义 ICC 配置文件的 url 路径或 Mac OS 中每个显示器的通用配置文件名称。我已经尝试了以下主显示,但它返回一个空字符串。就我而言,正确答案是系统偏好设置中的“/Users/roryhill/Library/ColorSync/Profiles/MacBook LCD_06-02-2021.icc”。
auto displayId = CGMaindisplayID();
auto colorSpace = CGdisplaycopyColorSpace(displayId);
auto name = CGColorSpacecopyName(colorSpace);
解决方法
我在 https://github.com/ndevenish/Hugin 找到了解决方案。为了在 Qt 环境中运行,我做了一些小调整。
在标题中:
static QString getDisplayProfileURL();
typedef struct {
CFUUIDRef dispuuid;
CFURLRef url;
} ColorSyncIteratorData;
static bool colorSyncIterateCallback(CFDictionaryRef dict,void *data);
和来源
bool Mac::colorSyncIterateCallback(CFDictionaryRef dict,void *data)
{
ColorSyncIteratorData *iterData = (ColorSyncIteratorData *)data;
CFStringRef str;
CFUUIDRef uuid;
CFBooleanRef iscur;
if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceClass,(const void**)&str))
{
qWarning("kColorSyncDeviceClass failed");
return true;
}
if (!CFEqual(str,kColorSyncDisplayDeviceClass))
{
return true;
}
if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceID,(const void**)&uuid))
{
qWarning("kColorSyncDeviceID failed");
return true;
}
if (!CFEqual(uuid,iterData->dispuuid))
{
return true;
}
if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceProfileIsCurrent,(const void**)&iscur))
{
qWarning("kColorSyncDeviceProfileIsCurrent failed");
return true;
}
if (!CFBooleanGetValue(iscur))
{
return true;
}
if (!CFDictionaryGetValueIfPresent(dict,kColorSyncDeviceProfileURL,(const void**)&(iterData->url)))
{
qWarning("Could not get current profile URL");
return true;
}
CFRetain(iterData->url);
return false;
}
QString Mac::getDisplayProfileURL()
{
ColorSyncIteratorData data;
data.dispuuid = CGDisplayCreateUUIDFromDisplayID(CGMainDisplayID());
data.url = NULL;
ColorSyncIterateDeviceProfiles(colorSyncIterateCallback,(void *)&data);
CFRelease(data.dispuuid);
CFStringRef urlstr = CFURLCopyFileSystemPath(data.url,kCFURLPOSIXPathStyle);
CFRelease(data.url);
return QString::fromCFString(urlstr);
}