2013-04-04 1 views
0

Я нахожусь в незавидном положении работы с огромной установленной базой кода для приложения, которое должно работать как на Windows, так и на OSX. Раздел, в котором я сейчас работаю, содержит некоторый унаследованный код для инструмента выбора пипетки/цвета. К сожалению, у меня нет большого опыта разработки для Mac, поэтому я надеюсь, что кто-то может пролить свет на мою проблему.Как обеспечить, чтобы инструмент eyedropper возвращал постоянное значение, несмотря на разные профили отображения?

Цветовая палитра немного неправильна в некоторых случаях, и я проследил проблему с разницей между ожидаемым CGColorSpaceRef, который задается вызовом CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB) и фактическим цветовым пространством, заданным основным профилем отображения. Настройка профиля отображения ОС на общий RGB устраняет несоответствие, но я хочу, чтобы пипетка получала согласованный цвет независимо от того, что представляет собой профиль отображения.

Извлечение профиля отображения основного монитора и использование этого вместо общего RGB гарантируют, что инструмент eyedropper получит согласованное значение? Я нашел функцию CGColorSpaceCreateWithPlatformColorSpace (...), но, согласно документации, она устарела с OSX 10.6. Каким будет нынешний способ справиться с этим в Quartz?

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

+0

Похоже, существующий вызов к CGColorSpaceCreateWithName (...) может быть проблема. Я заменил его на вызов CGColorSpaceCreateDeviceRGB(), и он, похоже, получает цветовое пространство, соответствующее профилю отображения, и не вызывает неправильных цветов eyedropper. Там могут быть риски, связанные с этим изменением, но если есть, я не знаю о них. – Ben

ответ

0

NSColor имеет эту функцию:

-(void)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha 

который будет возвращать компоненты RGB преобразуются из устройства в зависимости от цветовых.

Пример взят из Radiant Color Picker

CGFloat red, green, blue, a; 
NSColor *colorAsRGB = [_color colorUsingColorSpaceName:NSDeviceRGBColorSpace]; 
[colorAsRGB getRed:&red green:&green blue:&blue alpha:&a]; 

Соответствующие ссылки:

NSColor

Working With Colorspaces

+0

Есть ли способ сделать это в C/C++? У меня есть только поверхностное знание Objective-C, и приложение использует только C/C++. – Ben

+0

Этот поток может быть тем, что вы ищете: http://stackoverflow.com/questions/4700168/get-rgb-value-from-uicolor-presets – SG1

+0

и изменить строку CGContextSetFillColorWithColor (контекст, [цвет CGColor]); для использования функции void CGContextSetFillColor ( CGContextRef c, const Компоненты CGFloat [] ); вместо – SG1