Цветовые схемы
От: Роман Акопов Грузия http://adontz.wordpress.com/
Дата: 26.03.04 04:14
Оценка: 900 (19) +1
Статья:
Цветовые схемы
Автор(ы): Роман Акопов
Дата: 03.10.2004
Статья рассказывает о различных цветовых схемах и о способах преобразования цветовых значений, представленных в различных схемах.



Авторы:
Роман Акопов

Аннотация:
Статья рассказывает о различных цветовых схемах и о способах преобразования цветовых значений, представленных в различных схемах.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Цветовые схемы
От: Lonely Dog Россия  
Дата: 11.10.04 06:26
Оценка:
Здравствуйте, Роман Акопов, Вы писали:

РА>Статья:



РА>Авторы:

РА> Роман Акопов

РА>Аннотация:

РА>Статья рассказывает о различных цветовых схемах и о способах преобразования цветовых значений, представленных в различных схемах.

Статья хорошая. Но, есть несколько замечаний:
1) Прочитав аннотацию, я расчитывал увидеть больше формул преобразования цветов. В статье есть все всего одна.
2) Наличие примера работы через ICM это плюс.
3) Описание различных цветовых схем не очень полное.
А так, все круто!
Re: Цветовые схемы
От: Spaider Верблюд  
Дата: 11.10.04 13:46
Оценка:
Здравствуйте, Роман Акопов, Вы писали:

Есть и другие схемы, основанные на представлении цвета не как смеси базовых цветов, а функции параметров иного рода. Например, довольно популярна схема HSB, в которой параметрами являются оттенок (Hue), насыщенность (Saturation), и яркость (Lightness).


А где в слове Lightness буква бэ? Лень самому рыться, может, имелось в виду Blackness?
--
К вашим услугам,
Re[2]: Цветовые схемы
От: Stanky  
Дата: 11.10.04 16:15
Оценка: :)
> А где в слове Lightness буква бэ? Лень самому рыться, может, имелось
> в виду Blackness?
>
Тогда уж Brightness!!!
Posted via RSDN NNTP Server 1.9 gamma
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re: Цветовые схемы
От: Аноним  
Дата: 12.10.04 12:30
Оценка:
Здравствуйте, Роман Акопов, Вы писали:

РА>Аннотация:

РА>Статья рассказывает о различных цветовых схемах и о способах преобразования цветовых значений, представленных в различных схемах.

А вот кстати, если можно, вопрос: как строить программно графики цветового охвата для конкретного устройства?
(тот который типа

)

Сам цветовой охват я строил так: перебирал все цвета r=0..255, g=0.255, b=0.255, для каждого цвета переводил RGB —> XYZ -> xy, по которым и строил график.
Вопрос в том, как определить, цвета, входящие в гамут определенного устройства? Я использовал функции типа IsColorInGamut (или как-то так, точно не помню), но какая-то фигня получалась...
Re: Цветовые схемы
От: Аноним  
Дата: 15.10.04 11:17
Оценка:
какая-то лажа... формулы перевода RGB->CMY неправильные. правильно
C = 255-R
M = 255-G
Y = 255-B.
также результаты работы программы выглядят сомнительно.
кажется, что 240-C, 240-M, 240-Y, 204-K должны дать правильные значения.
белый цвет в CMYK должен быть (0,0,0,0).
Re[2]: Цветовые схемы
От: Аноним  
Дата: 18.10.04 10:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>какая-то лажа... формулы перевода RGB->CMY неправильные. правильно

А>C = 255-R
А>M = 255-G
А>Y = 255-B.
А>также результаты работы программы выглядят сомнительно.

Не совсем так.
Приведенные формулы — для "идеального" устройства. Реальное устройство вывода будет иметь цвета, отличные от этих. Это связано с тем, какое реально количество краски надо вывести, чтобы получить нужный цвет. Для сравнения можно открыть в Фотошопе файл, задать цвет и посмотреть его значения CMYK. Кстати, значение "точки черного" в Шопе настраивается, по умолчанию RGB(0, 0, 0) = CMYK(75, 68, 67, 90).
Re[3]: Цветовые схемы
От: Аноним  
Дата: 18.10.04 23:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>какая-то лажа... формулы перевода RGB->CMY неправильные. правильно

А>>C = 255-R
А>>M = 255-G
А>>Y = 255-B.
А>>также результаты работы программы выглядят сомнительно.

А>Не совсем так.

А>Приведенные формулы — для "идеального" устройства. Реальное устройство вывода будет иметь цвета, отличные от этих. Это связано с тем, какое реально количество краски надо вывести, чтобы получить нужный цвет. Для сравнения можно открыть в Фотошопе файл, задать цвет и посмотреть его значения CMYK. Кстати, значение "точки черного" в Шопе настраивается, по умолчанию RGB(0, 0, 0) = CMYK(75, 68, 67, 90).

гхм... я-то привел формулы для перевода в CMY, а не в CMYK. какие-такие реальные устройства, отображающие цвет в CMY?

ну да ладно, мы с тобой, тезка, в главном-то согласны... что единственная формула приведенная в статье — чушь полная.
>>C = (G + B)/2
>>M = (R + B)/2
>>Y = (R + G)/2

хотелось бы еще мнение автора услышать...

предыдущий Аноним.
Re[2]: Цветовые схемы
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.04 12:02
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Статья хорошая. Но, есть несколько замечаний:


Ура!

LD>1) Прочитав аннотацию, я расчитывал увидеть больше формул преобразования цветов. В статье есть все всего одна.


Дело в том, что в интернете повсеместно разбросаны эти формулы. но как показала моя личная практика пользы от них, как от сферического коня в вакууме. Цветные принтеры (особенно струйные) и мониторы ох какие не идеальные устройства.

LD>2) Наличие примера работы через ICM это плюс.


Это не плюс, это суть!

LD>3) Описание различных цветовых схем не очень полное.


Я описал лишь основные.

LD>А так, все круто!


Пасиба
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Цветовые схемы
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.04 12:03
Оценка:
Здравствуйте, Spaider, Вы писали:

S>

Есть и другие схемы, основанные на представлении цвета не как смеси базовых цветов, а функции параметров иного рода. Например, довольно популярна схема HSB, в которой параметрами являются оттенок (Hue), насыщенность (Saturation), и яркость (Lightness).

S>А где в слове Lightness буква бэ? Лень самому рыться, может, имелось в виду Blackness?

Черви поели (Brightness наверное)
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Цветовые схемы
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.04 12:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А вот кстати, если можно, вопрос: как строить программно графики цветового охвата для конкретного устройства?


Никак. Это особенность аппаратуры. Либо производитель вам её сообщит, либо нет. Насколько я знаю Photoshop и PhotoPaint показывая Gamut Colors имеют ввиду некие усреднённые устройства.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Цветовые схемы
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.11.04 12:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>ну да ладно, мы с тобой, тезка, в главном-то согласны... что единственная формула приведенная в статье — чушь полная.

А>
>>>C = (G + B)/2
>>>M = (R + B)/2
>>>Y = (R + G)/2
А>

А>хотелось бы еще мнение автора услышать...

Есть идеальная система CMY и практическая CMYK.

Идеальной само собой пользоваться бесполезно. Смесь бирюзового, фиолетового и жёлтого цветов даст совсем не чёрный.

Переводить RGB в CMY можно по моим формулам. Но это будет вне контекста устройства, а значит практически бесполезно.

CMYK избыточное пространство. Один и тот же цвет можно теоретически получить разными сочетаниями компонент. Какие конкретно выбрать сочетания сильно зависит от особенностей устройства. Конвертировать RGB в CMYK вне контекста устройства не имеет большого смысла.

Соотвественно и формулы для конвертации RGB в CMYK это нонсенс. Может быть только таблица соответствия созданная производителем аппаратуры.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: Цветовые схемы
От: Аноним  
Дата: 23.11.04 11:50
Оценка:
A>Переводить RGB в CMY можно по моим формулам. Но это будет вне контекста устройства, а значит практически бесполезно.
Роман, я уже 2 раза написал: нельзя переводить RGB в CMY по Вашим формулам! По ним получается, что черный цвет (0,0,0) в RGB переводится в (0,0,0) в CMY. Но (0,0,0) в CMY это белый цвет! Ведь очевидно, что если одна схема аддитивная, а другая субтрактивная, то схемы перевода из одной в другую должны включать компоненты цвета с отрицательными коэффициентами.

А по Вашей формуле перевода CMY->RGB
A>R = (M + Y — C)
A>G = (C + Y — M)
A>B = (C + M — Y)
вообще можно получить отрицательные значения RGB: (1,0,0) в CMY переводится в (-1,1,1) в RGB.

Аналогично, результат работы программы тоже неверен. В чем проблема, я сказать не могу, с ICM я не работал, но базовые цвета должны переводиться в базовые. А у Вас белый переводится в что-то бессмысленное:
A> RGB(255, 255, 255) aka 'White' corresponds to CMYK(240, 240, 240, 204)
На самом деле, в CMYK есть ограничение на сумму компонент C+M+Y+K, т.е. на общее количество краски на точку. И такое количество краски (240+240+240+204) никто не позволит налить. А если бы позволили, то в результате получилось бы что-то черное.

Предыдущий Аноним.
Re[6]: Цветовые схемы
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.11.04 08:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Аналогично, результат работы программы тоже неверен. В чем проблема, я сказать не могу, с ICM я не работал, но базовые цвета должны переводиться в базовые. А у Вас белый переводится в что-то бессмысленное:


Вы судя по всему вообще не разобрались в программе! Ничего аналогичного там бытьне может, так как используется ICM. Но я вполне готов признать, что Я и все разработчики ICM, вместе не правы, если вам так лучше спится.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: Цветовые схемы
От: nikkie Россия  
Дата: 13.12.04 21:28
Оценка: 34 (2)
A>Вы судя по всему вообще не разобрались в программе! Ничего аналогичного там бытьне может, так как используется ICM.
А Вы, судя по всему, вообще не удосужились задуматься над тем, что я пишу. Я не слепой и не идиот, вижу, что используется. Но для того, чтобы понять, что программа работает неверно, не обязательно разбирать код, если видно, что она выдает неверные результаты. Даже удивительно, почему автора не озадачил тот факт, что blacK-компонента всех цветов (в том числе белого!) оказалась равна 204.

A>Но я вполне готов признать, что Я и все разработчики ICM, вместе не правы, если вам так лучше спится.

Я про разработчиков ICM вроде ничего не говорил. А Вы уж будьте готовы к тому, что текст, который Вы предлагаете для публичного внимания, будет также публично обсуждаться и критиковаться. А постольку, поскольку этот текст может кем-то воспринят как руководство по использованию ICM, то я готов обсуждать его до тех пор, пока мы не придем к какому-то согласию. Пользы от этого больше, чем от отзывов типа "Все круто!".

Я потратил некоторое время на то, чтобы попытаться разобраться в ICM. На уровне моего сегодняшнего понимания я вижу две ошибки в использовании функции TranslateColors в статье.

1. Компоненты цвета (RGB, CMYK, XYZ, LAB) в структуре COLOR имеют тип WORD, т.е. 16-битные, а автор пытается работать с ними как с 8-битными:
    // Трансформировать белый RGB в CMYK
    source.rgb.red = 255;
    source.rgb.green = 255;
    source.rgb.blue = 255;

        printf( 
        "\t\tRGB(255, 255, 255) aka 'White' corresponds to CMYK(%3d, %3d, %3d, %3d)\n",
                ( BYTE ) destination.cmyk.cyan,
                ( BYTE ) destination.cmyk.magenta,
                ( BYTE ) destination.cmyk.yellow,
                ( BYTE ) destination.cmyk.black );


2. Нельзя использовать произвольно выбранный профайл для преобразования в требуемую цветовую систему (в нашем случае CMYK). Профайл должен поддерживать эту цветовую систему. На фоне практически полного отсутсвия информации по ICM, следующее сообщение, которое я нашел в группе microsoft.public.win32.programmer.gdi, прямо-таки откровение:

From: Antti Nivala (antti.nivala@motivesys.com)
Subject: Re: Transforming colors with ICM 
Date: 2004-01-06 05:04:42 PST 

> > Doesn't anybody have any clue about this? It can't be that I'm the only
> > one experiencing this problem, am I?

I think I had the same problem, too. I first assumed I can just use ICM to
convert from CMYK to RGB using TranslateColors. However, this only works if
the color transformation you give to TranslateColors is compatible with the
color spaces involved.

To convert from CMYK to RGB using TranslateColors, you must have a color
transform that converts from a CMYK-based ICC profile's color space to an
RGB-based profile's color space. If you just take the printer's profile and
use it as the source you might likely have an RGB profile because
non-PostScript Windows printers can only have RGB profiles. Only PostScript
printers can have CMYK profiles in Windows.

What I found most strange was that if I use TranslateColors to convert from
CMYK to RGB and give it an RGB-RGB transformation, it claims success but
does not really do the conversion. I think it just copied the values
literally and reported success (why???). This could explain why your CMYK
yellow (0, 0, 65535, 0) results in RGB blue (0, 0, 65535): TranslateColors
did not really do any conversion, and you are interpreting the original CMYK
values as if they were RGB (yellow and blue are in the same byte slots in
the union...).

TranslateBitmapBits reports an error in a similar situation, I don't
understand why TranslateColors does not.

Antti Nivala
Motive Systems


В моем случае TranslateColors с использованием профайла монитора в действительности меняет каким-то образом RGB-компоненты (которые расположены там же, где и CMY-компоненты в union COLOR), но, как оказывается, оставляет неизменной K-компоненту. Таким образом, K=204 (или 0xCC) появляющееся при конвертации всех четырех цветов в статье — просто мусор, оставшийся просто потому, что переменная source не была полностью проинициализирована.

Неудивительно, что профайл монитора не поддерживает CMYK. Список профайлов, поддерживающих CMYK, можно получить следующим образом:

    ENUMTYPE enumtype;
    ZeroMemory(&enumtype, sizeof(ENUMTYPE));
    enumtype.dwSize = sizeof(ENUMTYPE);
    enumtype.dwVersion = ENUM_TYPE_VERSION;
    enumtype.dwFields = ET_DATACOLORSPACE;
    enumtype.dwDataColorSpace = SPACE_CMYK;

    char buf[10000];
    DWORD dwSize = sizeof(buf), dwCount = 0;
    if (EnumColorProfiles(NULL, &enumtype, (PBYTE)buf, &dwSize, &dwCount)) {
        char *tmp = buf;
        for (DWORD i = 0; i < dwCount; i ++) {
            printf("%s\n", tmp);
            tmp += strlen(tmp) + 1;
        }
    }


Тестирование TranslateColors с использованием профайла, поддерживающего CMYK, дает следующий результат, который уже больше похож на правду:
        Testing profile 'Photoshop4DefaultCMYK.icc'
                RGB(FFFF, FFFF, FFFF) aka 'White' corresponds to CMYK(  10,    A,    0,    0)
                RGB(FFFF,    0,    0) aka 'Red'   corresponds to CMYK(   0, EB3C, FF5C,    0)
                RGB(   0, FFFF,    0) aka 'Green' corresponds to CMYK(A5D1,    0, EE2A,    0)
                RGB(   0,    0, FFFF) aka 'Blue'  corresponds to CMYK(FFFF, DABE,    0,    0)
Re[8]: Цветовые схемы
От: adontz Грузия http://adontz.wordpress.com/
Дата: 14.12.04 13:38
Оценка:
Здравствуйте, nikkie, Вы писали:

N>А Вы, судя по всему, вообще не удосужились задуматься над тем, что я пишу. Я не слепой и не идиот, вижу, что используется. Но для того, чтобы понять, что программа работает неверно, не обязательно разбирать код, если видно, что она выдает неверные результаты. Даже удивительно, почему автора не озадачил тот факт, что blacK-компонента всех цветов (в том числе белого!) оказалась равна 204.


Кто сказал, что не озадачил? Просто я печатал на струйных принтерах (которые несомненно CMYK) изображения в BMP/GIF/JPEG форматах (которые хранятся в программах как RGB) явно указывая какие ICM-профили использовать. Результаты были разные (не редко довольно поганые), но белый всегда оставался белым, а чёрный — чёрным. Я не имею ни малейшего понятия как принтер воспринимает число 204 (80%) в качестве чёрной составляющей, я знаю что когда этот цвет посылаешь на принтер, то выходит белый. Мне этого достаточно. Зачем вникать в особенности восприятия принтером значений CMYK когда ICP-api создано как раз чтобы НЕ вникать?

A>>Но я вполне готов признать, что Я и все разработчики ICM, вместе не правы, если вам так лучше спится.

N>Я про разработчиков ICM вроде ничего не говорил. А Вы уж будьте готовы к тому, что текст, который Вы предлагаете для публичного внимания, будет также публично обсуждаться и критиковаться. А постольку, поскольку этот текст может кем-то воспринят как руководство по использованию ICM, то я готов обсуждать его до тех пор, пока мы не придем к какому-то согласию. Пользы от этого больше, чем от отзывов типа "Все круто!".

Вот с этим абсолютно согласен! Только давайте не скатываться на фразы типа "ты — дурак" (ОК, я тоже был резок — извиняюсь), а обсуждать конструктивно.

N>Я потратил некоторое время на то, чтобы попытаться разобраться в ICM. На уровне моего сегодняшнего понимания я вижу две ошибки в использовании функции TranslateColors в статье.


N>1. Компоненты цвета (RGB, CMYK, XYZ, LAB) в структуре COLOR имеют тип WORD, т.е. 16-битные, а автор пытается работать с ними как с 8-битными:


OK, принимается. Вот вывод если везде 255 заменить на 65535

DISPLAY ADAPTERS
        Enumerating for adapter '\\.\DISPLAY1'
        Testing profile 'C:\WINDOWS\system32\spool\DRIVERS\COLOR\995E.ICM'
                RGB(65535, 65535, 65535) aka 'White' corresponds to CMYK(255,  40, 248, 204)
                RGB(65535,   0,   0) aka 'Red'   corresponds to CMYK(255,   0,   0, 204)
                RGB(  0, 65535,   0) aka 'Green' corresponds to CMYK( 21, 105,   0, 204)
                RGB(  0,   0, 65535) aka 'Blue'  corresponds to CMYK(  9, 168,  74, 204)
        End of enumeration for adapter '\\.\DISPLAY1'
        Enumerating for adapter '\\.\DISPLAYV1'
        End of enumeration for adapter '\\.\DISPLAYV1'
        Enumerating for adapter '\\.\DISPLAYV2'
        End of enumeration for adapter '\\.\DISPLAYV2'
END DISPLAY ADAPTERS

PRINTERS
        Enumerating for printer 'PDFConverter'
        End of enumeration for printer 'PDFConverter'
        Enumerating for printer 'PDF Creator'
        End of enumeration for printer 'PDF Creator'
        Enumerating for printer 'Fax'
        End of enumeration for printer 'Fax'
END PRINTERS


Как видишь значения CMYK остались в пределах 0-255, хотя структура CMYKCOLOR объявлена так
struct CMYKCOLOR {
  WORD    cyan;
  WORD    magenta;
  WORD    yellow;
  WORD    black;
};


Так что на мой взгляд входные данные должны быть в диапазоне 0-255, а тип WORD это. Более того, если бы погляден заголовочный файл, где описывается константа COLOR_RGB то увидел бы рядом другую. вот всё объявление полностью.
typedef enum {
    COLOR_GRAY       =   1,
    COLOR_RGB,
    COLOR_XYZ,
    COLOR_Yxy,
    COLOR_Lab,
    COLOR_3_CHANNEL,        // WORD per channel
    COLOR_CMYK,
    COLOR_5_CHANNEL,        // BYTE per channel
    COLOR_6_CHANNEL,        //      - do -
    COLOR_7_CHANNEL,        //      - do -
    COLOR_8_CHANNEL,        //      - do -
    COLOR_NAMED,
} COLORTYPE;



N>2. Нельзя использовать произвольно выбранный профайл для преобразования в требуемую цветовую систему (в нашем случае CMYK). Профайл должен поддерживать эту цветовую систему. На фоне практически полного отсутсвия информации по ICM, следующее сообщение, которое я нашел в группе microsoft.public.win32.programmer.gdi, прямо-таки откровение:


From: Antti Nivala (antti.nivala@motivesys.com)
Subject: Re: Transforming colors with ICM 
Date: 2004-01-06 05:04:42 PST 
...............
...............
..............


N>В моем случае TranslateColors с использованием профайла монитора в действительности меняет каким-то образом RGB-компоненты (которые расположены там же, где и CMY-компоненты в union COLOR), но, как оказывается, оставляет неизменной K-компоненту. Таким образом, K=204 (или 0xCC) появляющееся при конвертации всех четырех цветов в статье — просто мусор, оставшийся просто потому, что переменная source не была полностью проинициализирована.


ОК, теперь давай разберёмся, что мы утверждаем. Что TranslateColors вообще нельзя использовать или что мой пример был неудачным потому что основывался на мониторе — не CMYK устройстве.
С другой стороны, что нам мешает CMYK трансформировать в RGB в контексте монитора? Это-то точно имеет смысл.
Как показал мой экперимент значение source.cmyk.black не имеет никакого значения для трансформации.

N>Тестирование TranslateColors с использованием профайла, поддерживающего CMYK, дает следующий результат, который уже больше похож на правду:

N>
N>        Testing profile 'Photoshop4DefaultCMYK.icc'
N>                RGB(FFFF, FFFF, FFFF) aka 'White' corresponds to CMYK(  10,    A,    0,    0)
N>                RGB(FFFF,    0,    0) aka 'Red'   corresponds to CMYK(   0, EB3C, FF5C,    0)
N>                RGB(   0, FFFF,    0) aka 'Green' corresponds to CMYK(A5D1,    0, EE2A,    0)
N>                RGB(   0,    0, FFFF) aka 'Blue'  corresponds to CMYK(FFFF, DABE,    0,    0)
N>


Хорошо бы это потестировать на RGB(FF, FF, FF), тогда уже можно будет точно говорить.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[9]: Цветовые схемы
От: nikkie Россия  
Дата: 14.12.04 20:32
Оценка:
N>>1. Компоненты цвета (RGB, CMYK, XYZ, LAB) в структуре COLOR имеют тип WORD, т.е. 16-битные, а автор пытается работать с ними как с 8-битными:

A>OK, принимается. Вот вывод если везде 255 заменить на 65535


A>
A>...
A>


A>Как видишь значения CMYK остались в пределах 0-255


Осталось еще насильное приведение к BYTE убрать.


A>Более того, если бы погляден заголовочный файл, где описывается константа COLOR_RGB то увидел бы рядом другую. вот всё объявление полностью.

A>
A>typedef enum {
A>    COLOR_GRAY       =   1,
A>    COLOR_RGB,
A>    COLOR_XYZ,
A>    COLOR_Yxy,
A>    COLOR_Lab,
A>    COLOR_3_CHANNEL,        // WORD per channel
A>    COLOR_CMYK,
A>    COLOR_5_CHANNEL,        // BYTE per channel
A>    COLOR_6_CHANNEL,        //      - do -
A>    COLOR_7_CHANNEL,        //      - do -
A>    COLOR_8_CHANNEL,        //      - do -
A>    COLOR_NAMED,
A>} COLORTYPE;
A>


Ну и о чем это говорит? Структура COLOR состоит из 4 WORD. Поэтому 5-6-7-8-канальный формат цвета использует BYTE на каждый канал. Остальные — WORD.

A>ОК, теперь давай разберёмся, что мы утверждаем. Что TranslateColors вообще нельзя использовать или что мой пример был неудачным потому что основывался на мониторе — не CMYK устройстве.


ИМХО, ошибка была в том, что использовался профайл, неподдерживающий CMYK.

Более того, я привел цитату Antti Nivala (и я склонен ему доверять — чувствуется, что он понимает то, о чем пишет), в которой он утверждает, что профиль принтера вполне может оказаться RGB. То есть, если брать профиль от принтера, то еще нет гарантии, что он будет поддерживать CMYK.

A>С другой стороны, что нам мешает CMYK трансформировать в RGB в контексте монитора? Это-то точно имеет смысл.

A>Как показал мой экперимент значение source.cmyk.black не имеет никакого значения для трансформации.

ИМХО, TranslateColors может игнорировать параметры ctInput и ctOutput в определенных ситуациях (например, при попытке выполнить преобразование к CMYK с помощью RGB-профиля). Тот же Antti Nivala написал:
TranslateBitmapBits reports an error in a similar situation, I don't understand why TranslateColors does not.
Re[10]: Цветовые схемы
От: adontz Грузия http://adontz.wordpress.com/
Дата: 14.12.04 21:39
Оценка:
A>>ОК, теперь давай разберёмся, что мы утверждаем. Что TranslateColors вообще нельзя использовать или что мой пример был неудачным потому что основывался на мониторе — не CMYK устройстве.
N>ИМХО, ошибка была в том, что использовался профайл, неподдерживающий CMYK.

ОК, недоглядел.

N>Более того, я привел цитату Antti Nivala (и я склонен ему доверять — чувствуется, что он понимает то, о чем пишет), в которой он утверждает, что профиль принтера вполне может оказаться RGB. То есть, если брать профиль от принтера, то еще нет гарантии, что он будет поддерживать CMYK.


Ну лично для меня довольнос транно, что принтер имеет RGB профиль.

N>ИМХО, TranslateColors может игнорировать параметры ctInput и ctOutput в определенных ситуациях (например, при попытке выполнить преобразование к CMYK с помощью RGB-профиля). Тот же Antti Nivala написал:

N>
N>TranslateBitmapBits reports an error in a similar situation, I don't understand why TranslateColors does not.
N>


И это полнейший идиотизм со стороны данной функции. Я подумаю можно ли как-то отследить данные случаи.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: По просьбам трудящихся написал пример на C#
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.04.06 04:35
Оценка: 1 (1)
Это просто демострирует рабочий Interop и ничего больше!!!
using System;
using System.Runtime.InteropServices;

namespace ICM
{
    public class Program
    {
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct DISPLAY_DEVICEW
        {
            public int Size;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string DeviceName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string DeviceString;
            public int StateFlags;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string DeviceID;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string DeviceKey;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct PROFILEW
        {
            public int Type;
            [MarshalAs(UnmanagedType.BStr)]
            public string Data;
            public int DataSize;
            
            public PROFILEW(string filename)
            {
                Type = 1;
                Data = filename;
                DataSize = 2 * filename.Length;
            }
        }

        struct CIEXYZ
        {
            public int ciexyzX;
            public int ciexyzY;
            public int ciexyzZ;
        }

        struct CIEXYZTRIPLE
        {
            public CIEXYZ ciexyzRed;
            public CIEXYZ ciexyzGreen;
            public CIEXYZ ciexyzBlue;
        }
        
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct LOGCOLORSPACEW
        {
            public int lcsSignature; 
            public int lcsVersion; 
            public int lcsSize;
            public int lcsCSType;
            public int lcsIntent; 
            public CIEXYZTRIPLE lcsEndpoints;
            public int lcsGammaRed;
            public int lcsGammaGreen; 
            public int lcsGammaBlue;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string lcsFilename;
        }; 

        struct ColorType
        {
            public const int COLOR_GRAY = 1;
            public const int COLOR_RGB = 2;
            public const int COLOR_XYZ = 3;
            public const int COLOR_Yxy = 4;
            public const int COLOR_Lab = 5;
            public const int COLOR_3_CHANNEL = 6;
            public const int COLOR_CMYK = 7;
            public const int COLOR_5_CHANNEL = 8;
            public const int COLOR_6_CHANNEL = 9;
            public const int COLOR_7_CHANNEL = 10;
            public const int COLOR_8_CHANNEL = 11;
            public const int COLOR_NAMED = 12;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct RGBCOLOR
        {
            public short Red;
            public short Green;
            public short Blue;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct CMYKCOLOR
        {
            public short Cyan;
            public short Magenta;
            public short Yellow;
            public short Black;
        }

        [DllImport("User32.dll")]
        static extern bool EnumDisplayDevicesW(string device, int deviceIndex, ref DISPLAY_DEVICEW displayDevice, uint flags);
        
        [DllImport("Gdi32.dll")]
        static extern IntPtr CreateDC(string driver, string device, IntPtr reserved, IntPtr printerData);

        [DllImport("Gdi32.dll")]
        static extern bool DeleteDC(IntPtr hDC);

        delegate int EnumICMProfilesCallback(string filename, int lParam);
        
        [DllImport("Gdi32.dll")]
        static extern int EnumICMProfiles(IntPtr hDC, EnumICMProfilesCallback lpEnumFunc, int lParam);

        [DllImport("mscms.dll")]
        static extern IntPtr OpenColorProfileW(ref PROFILEW profile, int access, int shareMode, int creationMode);

        [DllImport("mscms.dll")]
        static extern bool CloseColorProfile(IntPtr hProfile);

        [DllImport("mscms.dll")]
        static extern IntPtr CreateColorTransformW(ref LOGCOLORSPACEW logColorSpace, IntPtr hProfileDestination, IntPtr hProfileSource, int flags);

        [DllImport("mscms.dll")]
        static extern bool DeleteColorTransform(IntPtr hColorTransform);

        [DllImport("mscms.dll")]
        static extern bool TranslateColors(
            IntPtr hColorTransform,
            [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)][In] RGBCOLOR[] inputColor, int inputColorCount, int MustBe2,
            [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)][Out] CMYKCOLOR[] outputColor, int MustBe7);
        [DllImport("mscms.dll")]
        static extern bool TranslateColors(
            IntPtr hColorTransform,
            [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)][In] CMYKCOLOR[] inputColor, int inputColorCount, int MustBe7,
            [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)][Out] RGBCOLOR[] outputColor, int MustBe2);

        static void WriteTransform(IntPtr hColorTransform, short r, short g, short b)
        {
            RGBCOLOR[] inColor = new RGBCOLOR[1];
                    
            inColor[0].Red = r;
            inColor[0].Green = g;
            inColor[0].Blue = b;

            CMYKCOLOR[] outColor = new CMYKCOLOR[inColor.Length];

            if (TranslateColors(hColorTransform, inColor, inColor.Length, 2, outColor, 7))
            {
                Console.WriteLine(
                    "\t\tRGB({0}, {1}, {2}) = CMYK ({3}, {4}, {5}, {6})",
                    inColor[0].Red, inColor[0].Green, inColor[0].Blue,
                    outColor[0].Cyan, outColor[0].Magenta, outColor[0].Yellow, outColor[0].Black);
            }    
        }
        
        static int EnumICMProfilesProc(string filename, int lParam)
        {
            Console.WriteLine("\tProfile: {0}", filename);
            
            PROFILEW profile = new PROFILEW(filename);

            IntPtr hProfile = OpenColorProfileW(ref profile, 1 /* PROFILE_READ */, 0x00000007 /* FILE_SHARE_ALL */, 3 /* OPEN_EXISTING */);

            if (hProfile != IntPtr.Zero)
            {
                LOGCOLORSPACEW logColorSpace = new LOGCOLORSPACEW();

                logColorSpace.lcsSignature = 0x50534F43; /* LCS_SIGNATURE */
                logColorSpace.lcsIntent = 0x00000004; /* LCS_GM_IMAGES */
                logColorSpace.lcsVersion = 0x0400;
                logColorSpace.lcsSize = Marshal.SizeOf(logColorSpace);
                logColorSpace.lcsCSType = 0x57696E20; /* LCS_WINDOWS_COLOR_SPACE */

                IntPtr hColorTransform = CreateColorTransformW(ref logColorSpace, hProfile, IntPtr.Zero, 0x00000003 /* BEST_MODE */);

                if (hColorTransform != IntPtr.Zero)
                {
                    WriteTransform(hColorTransform, 255, 0, 0);
                    WriteTransform(hColorTransform, 0, 255, 0);
                    WriteTransform(hColorTransform, 0, 0, 255);
                    
                    DeleteColorTransform(hColorTransform);
                }
                
                CloseColorProfile(hProfile);
            }
            
            return 1;
        }
        
        static void Main(string[] args)
        {
            for (int deviceIndex = 0; deviceIndex < 10; ++deviceIndex)
            {
                DISPLAY_DEVICEW displayDevice = new DISPLAY_DEVICEW();
                
                displayDevice.Size = Marshal.SizeOf(displayDevice);

                if (EnumDisplayDevicesW(null, deviceIndex, ref displayDevice, 0))
                {
                    Console.WriteLine("Device: {0}", displayDevice.DeviceName);
                    
                    IntPtr hDC = CreateDC(displayDevice.DeviceName, null, IntPtr.Zero, IntPtr.Zero);
                    
                    EnumICMProfiles(hDC, new EnumICMProfilesCallback(EnumICMProfilesProc), 0);
                    
                    DeleteDC(hDC);

                    Console.WriteLine();
                }
            }
        }
    }
}
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.