C #: Как получить значение цвета (в CMYK) в позиции на странице PDF? - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть цветной файл PDF CMYK (только с одной страницей и изображением, без текста). Я хочу получить значение цвета CMYK для «пикселя» в этом файле PDF (я называю позицию «пикселем»), в настоящее время я делаю это следующим образом:

 - Convert the PDF page to bitmap <br>
 - Get the color value of this pixel:
      Color cPixel = bmpImage.GetPixel(x, y);

Наконец, я конвертирую cPixel (RGB) в значение CMYK, однако это значение не является правильным :( (в исходном файле это 100% K, но результат сильно отличается). Я думаю, что проблема связана с моей обработкой: CMYK file => Обработка в RGB (преобразовать в растровое изображение, прочитать цвет в RGB) => Преобразовать результат в CMYK . Формула, используемая для преобразования из RGB-> CMYK:

Black   = minimum(1-Red,1-Green,1-Blue)
Cyan    = (1-Red-Black)/(1-Black)
Magenta = (1-Green-Black)/(1-Black)
Yellow  = (1-Blue-Black)/(1-Black)

Теперь я хочу прочитать значение CMYK напрямую из PDF, пожалуйста, помогите мне, если у вас есть идеи! Заранее благодарим за чтение и любую поддержку.

Большое спасибо !!!

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

Эти формулы для преобразования из RGB в CMYK (и аналогичные формулы для обратного преобразования) вставляются по всему Интернету, но дают очень плохие результаты, поскольку предполагают, что цветовые системы являются линейными. Это очень далеко от реальности. Не удивительно, что получающиеся цвета напоминают исходные цвета только очень отдаленно. Для достижения лучших результатов вам придется использовать цветовые профили (вы можете использовать независимые от устройства профили). Преобразование цветов полностью поддерживается функциями Windows.

К сожалению, функции для преобразования из RGB в CMYK с цветовым профилем напрямую не представлены в C #. Но вы можете найти полное решение в этом ответе .

Преобразование из CMYK в RGB с цветным профилем легче осуществить в C #. Решение в этом ответе . Перед его внедрением вы можете попробовать онлайн .

1 голос
/ 14 сентября 2011

Лучшим решением было бы выполнить поток содержимого страницы, определить, где на странице находится изображение, посмотреть, какой пиксель изображения соответствует положению вашей страницы, а затем извлечь этот пиксель непосредственно из изображения CMYK. Все выполняемые вами преобразования приводят к небольшим ошибкам, которые накапливаются, и поэтому ваш конечный результат отличается от ожидаемого. Формулы, которые вы использовали, дают вам приблизительное преобразование. RGB и CMYK являются зависящими от устройства цветовыми пространствами, более точное преобразование выполняется через независимое от промежуточного устройства цветовое пространство, такое как Lab. Таким образом, CMYK -> RGB становится CMYK -> Lab -> RGB и наоборот. Подробнее об этом вы можете прочитать здесь: http://forums.adobe.com/thread/428899 и здесь: http://en.wikipedia.org/wiki/Lab_color_space

1 голос
/ 14 сентября 2011

Я не знаю много о науке о цвете, но попробуйте проверить формулы в EasyRGB для справки: RGB в CMY , а затем CMY в CMYK .Я думаю, что эти формулы только приблизительные, потому что цветовые профили влияют на то, как это выглядит визуально.См. сообщение об использовании этих формул.

Редактировать:

Согласно это , ваша формула выглядит правильно.Просто убедитесь, что значения для RGB нормализованы (т.е. они находятся в диапазоне от 0 до 1,0).

...