Если вы хотите получить хороший результат, вам необходимо применить цветовой профиль. В .NET вы можете сделать это так (предполагая, что исходные компоненты CMYK находятся в диапазоне от 0 до 255):
float[] colorValues = new float[4];
colorValues[0] = c / 255f;
colorValues[1] = m / 255f;
colorValues[2] = y / 255f;
colorValues[3] = k / 255f;
System.Windows.Media.Color color = Color.FromValues(colorValues,
new Uri(@"C:\Users\me\Documents\ISOcoated_v2_300_eci.icc"));
System.Drawing.Color rgbColor = System.Drawing.Color.FromArgb(color.R, color.G, color.B);
Обратите внимание, что используются два разных класса Color из двух разных пространств имен. Вероятно, вам нужно добавить DLL PresentationCore в качестве ссылки.
Необходимый профиль цвета можно загрузить из раздела загрузки eci.org . Это часть большого ZIP-файла, содержащего несколько профилей. Они явно рекомендуют использовать профиль ISO Coated v2 300% (ECI).
Если вам нужно преобразовать полное изображение из CMYK в RGB, для этого в этом пространстве имен есть специальные классы.
ПОМЕЩЕННЫЙ по сравнению с ПАТЧЕМ Большое объяснение здесь: https://medium.com/backticks-tildes/restful-api-design-put-vs-patch-4a061aa3ed0b
По моему скромному мнению, средствам идемпотентности:
я отправляю конкурировать определение ресурса, таким образом - получающееся состояние ресурса точно как определяется ПОМЕЩЕННЫМИ параметрическими усилителями. Каждый раз, когда я обновляю ресурс с теми же ПОМЕЩЕННЫМИ параметрическими усилителями - получающееся состояние является точно тем же.
я отправил только часть определения ресурса, таким образом, это могло бы произойти, другие пользователи обновляют ДРУГИЕ параметры этого ресурса в тем временем. Следовательно - последовательные патчи с теми же параметрами и их значениями могли бы закончиться с другим состоянием ресурса. Например:
Считают объект определенным следующим образом:
CAR: - цвет: черный, - тип: седан, - места: 5
я исправляю его с:
{цвет: 'красный'}
полученный объект:
CAR: - цвет: красный, - тип: седан, - места: 5
Затем некоторые другие пользователи исправляют этот автомобиль с:
{тип: 'хэтчбек'}
так, полученный объект:
CAR: - цвет: красный, - тип: хэтчбек, - места: 5
Теперь, если я исправляю этот объект снова с:
{цвет: 'красный'}
полученный объект:
CAR: - цвет: красный, - тип: хэтчбек, - места: 5
, Что ОТЛИЧАЕТСЯ от того, что я имею ранее!
Поэтому ПАТЧ не является идемпотентом, в то время как ПОМЕЩЕНО идемпотент.
ПОМЕЩАЮТ => Набор все новые атрибуты для существующего ресурса.
ПАТЧ => Частично обновляют существующий ресурс (не все требуемые атрибуты).
Для завершения обсуждения idempotency я должен отметить, что можно определить idempotency в остальных контекст двумя способами. Давайте сначала формализуем несколько вещей:
А ресурс является функцией со своей областью изменения, являющейся классом строк. Другими словами, ресурс является подмножеством String × Any
, где все ключи уникальны. Давайте назовем класс ресурсов Res
.
операция REST А на ресурсах, функция f(x: Res, y: Res): Res
. Два примера операций REST:
PUT(x: Res, y: Res): Res = x
, и PATCH(x: Res, y: Res): Res
, который работает как PATCH({a: 2}, {a: 1, b: 3}) == {a: 2, b: 3}
. (Это определение специально предназначено для утверждения приблизительно PUT
и POST
, и например, не имеет большого количества смысла на GET
и POST
, поскольку это не заботится о персистентности).
Теперь, путем фиксации x: Res
(informatically разговор, с помощью приправляющий карри), PUT(x: Res)
и PATCH(x: Res)
одномерные функции типа Res → Res
.
, функция g: Res → Res
вызвана глобально идемпотентный , когда g ○ g == g
, т.е. для любого y: Res
, g(g(y)) = g(y)
.
Позволяют x: Res
ресурс, и k = x.keys
. Функция g = f(x)
вызвана оставленный идемпотент , когда для каждого y: Res
, мы имеем g(g(y))|ₖ == g(y)|ₖ
. Это в основном означает, что результат должен быть тем же, если мы смотрим на прикладные ключи.
Так, PATCH(x)
не глобально идемпотент, но оставлен идемпотент. И оставленный idempotency является вещью, которая имеет значение здесь: если мы исправляем несколько ключей ресурса, мы хотим, чтобы те ключи были тем же, если мы исправляем его снова, и мы не заботимся об остальной части ресурса.
И когда RFC говорит о ПАТЧЕ, не являющемся идемпотентом, говорит он о глобальном idempotency. Ну, хорошо, что это не глобально идемпотент, иначе это была бы поврежденная операция.
<час>Теперь, ответ Jason Hoetger пытается продемонстрировать, что ПАТЧУ даже не оставляют идемпотент, но он повреждает слишком много вещей сделать так:
t: Set<T> → Map<T, Boolean>
, определенный с [1 125]. Используя это определение, исправлению оставляют идемпотент. {id: 1, email: "me@site.com"}
, должен соответствовать [1 127], иначе программа всегда повреждается, и ПАТЧ не может возможно исправить). Если идентификатор сгенерирован прежде, чем проверить по набору, снова программа повреждается. можно сделать примеры ПОМЕЩЕННЫХ, являющихся неидемпотентом с повреждающейся половиной вещей, которые повреждаются в этом примере:
PUT /user/12 {email: "me@site.com"}
результаты в [1 129] в первый раз, и {email: "...", version: 2}
во второй раз. Всеми вышеупомянутыми примерами являются естественные примеры, с которыми можно встретиться.
<час>Мой конечный пункт, тот ПАТЧ не должен быть глобально идемпотентный , иначе не даст Вам желаемый эффект. Вы хотите изменить адрес электронной почты своего пользователя без касающейся остальной части информации, и Вы не хотите перезаписывать изменения другой стороны, получающей доступ к тому же ресурсу.