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.
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.
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!
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.
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 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.
Ideogramm
Stuart Weißhaus
Vinzenz
Stuart Weißhaus