Alternative Formeln für die Umwandlung von CMYK in RGB für die Anzeige auf dem Bildschirm

Ich schreibe Software, um Textabschnitte aus PDFs zu extrahieren und zur Analyse auf dem Bildschirm darzustellen; Ich muss den Text auf dem Bildschirm in der Farbe des Dokuments anzeigen.

Wenn das PDF im Moment CMYK-Farben enthält, verwende ich die einfache Formel, die im Internet weit verbreitet ist (z. B. hier ), die lautet:

R = 255 × (1-C) × (1-K)

Und ähnlich für die anderen Farben.

Dies führt jedoch zu schlechten Ergebnissen. Beispielsweise ist ein Beispiel, das ich habe, im PDF-Dokument mit dem Befehl "0,62 0 0,05 0 k" angegeben (dh das sind die CMYK-Komponenten auf einer Skala von 0-1). Die obige Formel wandelt dies in ein RGB von #60fff2 um. Adobe Reader rendert diesen Text jedoch mit RGB #3dc6ea. Diese sehen nicht nur sehr unterschiedlich aus, meine Farbe ist so hell, dass der Text schwer zu lesen ist. Ich habe dies auf mehreren Monitoren ausprobiert, und obwohl es Unterschiede in den Farben gibt, ist das Gesamtergebnis dasselbe: Der PDF-Reader zeigt ein helles Pastell- oder Himmelblau, während die obige Konvertierung ein helles Cyan ergibt.

Um zu überprüfen, ob dies nicht auf etwas in der PDF-Datei zurückzuführen ist, habe ich dieselbe Farbe in Illustrator ausprobiert: Eingabe eines CMYK von (62 %, 0 %, 5 %, 0 %), das auf dem Bildschirm als #3ec6ea gerendert wird. Beim Ändern des Farbbearbeitungsfelds auf RGB wurden Werte von #40c4e8 angezeigt; und dies wurde auch gerendert, wenn ich die Farbeinstellungen auf "Farbmonitor" geändert habe. Das sind 3 verschiedene Ergebnisse von Adobe - aber die Unterschiede sind winzig und sollten nicht wahrnehmbar sein.

Gibt es also praktikable alternative Konvertierungen, die Ergebnisse liefern, die den Adobe-Konvertierungen näher kommen? Mir ist bewusst, dass die Konvertierung zwischen RGB und CMYK problematisch ist, aber in diesem Fall wird etwas geholfen:

  • Die Konvertierung dient nur der Bildschirmanzeige. Ausgaben werden nicht gedruckt.

  • Unterschiede zwischen Monitoren sind nicht sehr wichtig. Wenn eine Farbe auf einem bestimmten Monitor in (z. B.) Adobe Reader schlecht wiedergegeben wird, erwarte ich kein gutes Ergebnis.

  • Eine exakte Übereinstimmung ist für mich irrelevant: Ich brauche nur eine Konvertierung, die ähnlich aussieht und lesbar ist.

Welche Programmiersprache verwendest du? Vielleicht gibt es eine Bibliothek, die die HardWork™️ für Sie erledigen kann.
Wir verwenden c#, aber ich denke, wir haben es gut genug gelöst. Ich werde posten, was wir jetzt als Antwort tun
Hallo Stuart! Schön, dich hier zu sehen. Haben wir zufällig in letzter Zeit zusammengearbeitet? :)
@Vincent - wenn Sie einige Logos für uns produziert haben, die ich in einer älteren Version von Illustrator benötigte, dann ja :)

Antworten (4)

Was Sie tun, ist eine sehr naive Version der Konvertierung. Das solltest du niemals tun. Weil es überhaupt nicht so funktioniert. Aber Vorsicht, das, wonach Sie fragen, ist in Wirklichkeit unglaublich kompliziert, komplizierter, als Sie sich jetzt vorstellen können. Ich könnte buchstäblich hundert Seiten darüber schreiben und wäre nicht fertig.

Entweder man greift auf einfache Tricks zurück oder man muss die ganze Arbeit machen.

Es gibt keine Formel

Sie benötigen ein Farbmanagementsystem, keine Optionen. Was Sie tun müssen, ist, das Farbprofil und die Wiedergabeabsicht des betreffenden Elements abzurufen. Führen Sie dann eine Profil-zu-Profil-Konvertierung in Ihr Monitorprofil durch.*

Sehen Sie, das PDF enthält die Hälfte der Informationen zur Durchführung der Bildschirmsimulation für Ihre Farben. Diese Informationen liegen jedoch in Form eines ICC-Profils vor, und ICC-Profile sind im Grunde eine Mini-Programmiersprache für die Farbkonvertierung. Die Implementierung Ihrer eigenen wäre also viel mehr Arbeit, als ich erwarte, dass die meisten Leute sie aufwenden müssen.

Jetzt verfügt Ihr Betriebssystem höchstwahrscheinlich über ein Farbmanagementsystem. Sie können entweder dieses verwenden oder so etwas wie ein winziges CMS verwenden , um die Konvertierung durchzuführen. Die Verwendung eines Ad-hoc-Systems wird Sie nicht glücklich machen, aber die Verwendung eines vorgefertigten CMS ist nicht allzu schwer. Sie bitten das CMS einfach, die Konvertierung für Sie durchzuführen.

* Wenn Sie genaue Farben wünschen, müssen Sie regelmäßig Ihren Monitor und die Hintergrundbeleuchtung Ihres Raums messen. Und ja, die RGB-Farbe ist auf jedem Monitor anders!

Danke für den winzigen CMS-Link - ich werde darauf zurückkommen, wenn sich herausstellt, dass wir eine bessere Lösung brauchen. Im Moment ist die Situation ab Ihrem letzten Absatz: "Wenn Sie genaue Farben wollen ..." - dass wir keine genauen, sondern nur lesbaren benötigen. So kommen wir hoffentlich mit der schnellen Lösung zurecht
Das Problem von @StuartWhitehouse besteht darin, dass Sie möglicherweise nicht verlangen, dass Ihre Benutzer jedoch mit ziemlicher Sicherheit erwarten, dass das, was sie sehen, korrekt ist. Affe sieht Affe tun...

Eine schnelle Lösung für die Lesbarkeit kann die Reduzierung der Farbigkeit sein. Für 25% Reduktion lassen Sie G=0,25.

Berechnen Sie den Durchschnitt Ihrer RGB-Zahlen des zu hellen Konvertierungsergebnisses. Lass es A sein.

Berechnen Sie für jede RGB-Zahl X das Neue mit reduzierter Farbigkeit, nennen wir es Y.

Verwenden Sie die Formel Y=(1-G)X+GA

HINZUFÜGEN aufgrund des Kommentars:

Sie können eine andere Ad-hoc-Zahl nehmen, den Helligkeitsreduktionsfaktor =F. Lassen Sie F=0,8, um die Helligkeit auf 80 % zu reduzieren. Multiplizieren Sie alle RGB-Zahlen damit.

Stellen Sie sicher, dass diese kein Ersatz für echte Farbmanagement-Mathematik sind.

Ein interessanter Vorschlag; Ich habe es kurz ausprobiert und es verbessert es bis zu einem gewissen Grad; aber lässt den Text immer noch sehr hell - einer der Unterschiede zwischen dem RGB, das Adobe rendert, und der einfachen Formel, die mir gegeben wird, ist, dass Adobes in allen 3 RGB-Kanälen dunkler ist.
@StuartWhitehouse Sie können nicht gleichzeitig einfache und dieselben Ergebnisse wie mit einem vollwertigen CMS erzielen. Es ist entweder gut genug oder wenn Sie pedantischer sind, dann braucht es ein vollständiges Farbmanagement
Ich habe dies als Antwort akzeptiert, weil es so aussieht, als wäre der Vorschlag, die Farbigkeit zu reduzieren, wahrscheinlich gut genug für uns. Ich hatte bereits überlegt, die Helligkeit gemäß dem Zusatz zu reduzieren - obwohl das riskant ist, wenn der Text hell auf dunklem Hintergrund ist. Wenn sich später herausstellt, dass dieser Fehler nicht ausreicht, müssen wir den langen Weg gehen und die ColorSpaces richtig machen

R = 255 × (1-C) × (1-K)

Ich habe keine Ahnung, was du gerade gesagt hast ... :o)

Sie müssen wahrscheinlich verstehen, dass CMYK oder RGB keine absoluten Werte sind.

Mein klassisches Beispiel ist ein Cyan-Marker. Verwenden Sie es auf Zeitschriftenpapier und auf Zeitungspapier. Es ist der gleiche Cyan-Wert, die gleiche Tinte ... andere Farbe.

Um eine CMYK-Farbe auf einem RGB-Bildschirm wiederzugeben, müssen Sie ein Farbprofil für die Bedeutung der CMYK-Werte nehmen (glänzendes Papier? Zeitung? unbeschichtetes Papier?) und es dann auf einem RGB-Bildschirm anzeigen.

Dieser RGB-Bildschirm geht normalerweise davon aus, dass er ein sRGB-Profil hat, aber dies kann auch ein zusätzliches Profil haben, das für den Bildschirm spezifisch ist.

Meiner Meinung nach ist es besser für Sie, zu lernen, wie man Farbprofile anwendet und zwischen ihnen umwandelt, als eine Tabelle mit 16 Millionen individuellen Umrechnungen zu erstellen.


Bearbeitet aufgrund des Kommentars.

Die gesamte Ausgabe erfolgt hier nur auf dem Bildschirm

Nein. Ein CMYK-Wert von C100, wie in meinem vorherigen Beispiel, ist in beiden Fällen 100 %, aber es ist nicht dieselbe Farbe.

Eine RGB-Ausgabe ist keine RGB-Ausgabe, sondern eine Simulation der Bedingungen, die ein CMYK-Druck haben soll. Aus diesem Grund müssen Sie definieren, wie dieser CMYK-Druck aussehen würde, um ihn zu simulieren.


Es wurde gesagt, dass Sie sich wahrscheinlich an die optimale Druckqualität halten möchten, die Sie haben können, wahrscheinlich mit etwas beschichtetem Papier, um es einzugrenzen, studieren Sie, wie Fogra 39 funktioniert.


Und ja, R = 255 × (1-C) × (1-K) bedeutet, dass Sie kein Cyan oder (K) Schwarz verwenden, daher verwenden Sie tatsächlich die anderen beiden linken Komponenten auf einem 4-Tinten-Drucksystem. Gelb und Magenta. Aber es ist lustig, wie es impliziert, zu erwähnen, was Sie nicht verwenden, anstatt zu definieren, was Sie tatsächlich verwenden.

Dies könnte insbesondere dann problematisch sein, wenn Ihr System tatsächlich mehr als 4 Tinten verwendet. Es gab ein Hexachrome-System, das 6. CMYK+GO verwendete


Bearbeitet 2.

Eine direkte Konvertierungsmethode könnte darin bestehen, die Umkehrung der Farbe zu verwenden, die in Ihrer Formel angegeben ist.

Rot ist die Abwesenheit von Cyan. Aber das verwirft alle schwarzen Informationen.

Farbprofile sind auch nicht linear oder haben eine glatte Kurve.

Schwarz wird von Anfang an nicht zu einer Farbe hinzugefügt, Pastellfarben haben kein Schwarz, und wenn die Farbe dunkler ist, fügen Sie nicht nur Schwarz hinzu, sondern verringern auch den Rest der Farben für einige Papierabsorptionsmaterialien.

Alle diese Informationen sind im Farbprofil vorhanden.


Sehen Sie sich das auch an. Es gibt einige Erklärungen. CMYK-Werte ändern sich ständig im RGB/8-Farbmodus, CS6

Die von Ihnen angegebene Formel gilt für den Rotkanal von RGB, basierend auf C und K aus der CMYK-Farbe. In Bezug auf das Zeitschriftenpapier und die Zeitung ... Ich verstehe, dass Farben in verschiedenen Kontexten unterschiedliche Ergebnisse liefern, jedoch erfolgt die gesamte Ausgabe hier nur auf dem Bildschirm - tatsächlich auf denselben Monitoren. Es ist eine andere Software, die radikal andere Ergebnisse liefert

Die Antwort von user287001 brachte zwar einige Verbesserungen, war aber in vielen Fällen immer noch problematisch. Ich poste unsere eventuelle Lösung, falls es anderen hilft.

Haftungsausschluss: Dies ist in keiner Weise "richtig". Die folgenden Koeffizienten sind diejenigen, die wir uns ausgedacht haben. (Tatsächlich haben wir eine Tabelle mit den gewünschten Eingaben und Ausgaben erstellt und diese einfach gelöst.) Wie andere kommentiert haben, hängt die Konvertierung von der Verwendung von CMYK ab. In einigen Fällen haben wir jedoch nur die Information ColorSpace = "DeviceCMYK", components = c,m,y,k. Es sind keine weiteren Informationen verfügbar und diese müssen auf dem Bildschirm gerendert werden. In welcher spezifischen Situation funktioniert der folgende C#-Code für uns ...

// inputs are c,m,y,k components on a 0-1 scale
// work with INVERSE of CMYK values, on a 0-255 scale
float C = 255 * (1 - c);
float M = 255 * (1 - m);
float Y = 255 * (1 - y);
float K = 255 * (1 - k);

float r = 80 + 0.5882f * C - 0.3529f * M - 0.1373f * Y + 0.00185f * C * M + 0.00046f * Y * C; // no YM
float g = 66 - 0.1961f * C + 0.2745f * M - 0.0627f * Y + 0.00215f * C * M + 0.00008f * Y * C + 0.00062f * Y * M;
float b = 86 - 0.3255f * C - 0.1569f * M + 0.1647f * Y + 0.00046f * C * M + 0.00123f * Y * C + 0.00215f * Y * M;
// (for non c# readers, the 'f' suffix on the numbers just indicates the precision of the data type to hold the value)
r = r * K / 255;
g = g * K / 255;
b = b * K / 255;
// b,g,r are now the RGB components on a 0-255 scale, but will be out of bounds sometimes and need to be truncated to 0 and 255
Color RGB = Color.FromArgb(255, ((int)r).LimitTo(0, 255), ((int)g).LimitTo(0, 255), ((int)b).LimitTo(0, 255));
// LimitTo is an extension defined elsewhere - the usage should be obvious!

Dies führt zu Ergebnissen, die für unsere Testfälle nicht von Standard-PDF-Readern zu unterscheiden sind.