In der graphicx Anleitung finde ich den Befehl nicht.

Wofur stehen die einzelnen Zahlen etwa bei decodearray={0.2 0.2 1 0 1 0.8 1 0} in

\includegraphics[width=2in,decodearray={1 0 1 0 1 0}]{example-grid-100x100bp.jpg}

Ziel: So ein Quasi-Schwarzweißbild aus einem Farbbild erzeugen.

alt text

Öffne in Overleaf
%\documentclass[a5paper]{article} 
\documentclass[]{standalone}
\usepackage{graphicx}

\begin{document}
\includegraphics[width=2in,]{example-grid-100x100bp.jpg}

\includegraphics[width=2in,decodearray={1 0 1 0 1 0}]{example-grid-100x100bp.jpg}

\includegraphics[width=2in,decodearray={0.2 0.2 1 0 1 0.8 1 0}]{example-grid-100x100bp.jpg}
\end{document}

gefragt 20 Mai, 06:57

cis's gravatar image

cis
8.2k15167262
Akzeptiert: 70%

bearbeitet 20 Mai, 06:58

Ist die Frage wirklich, wie decodearray arbeitet bzw. was es bewirkt, oder willst Du in Wirklichkeit wissen, wie Du die Farben eines eingebundenen JPEGs ändern kannst? Auf die letzte Frage wäre decodearray eine mögliche Antwort ;-) Für erstes sei auf https://tex.stackexchange.com/a/150219 verwiesen.

(23 Mai, 13:44) saputello

@Moss the TeXie Ich weiß leider nicht wie man das verwendet. Kannst Du ggf. mit dem MWE im Startpost daraus einen lauffähigen Code erstellen?

(23 Mai, 14:03) cis

So gesehen, sowohl als auch. Ich habe nicht rausgefunden wofür die Zahlen decodearray={1 0 1 0 1 0} stehen. Wenn ich das weiß, kann ich ggf. das Bild manipulieren.

(23 Mai, 14:09) cis

Option decodearray wird auf die PDF-Eigenschaft /Decode abgebildet und dient dazu, die Farben eines Eingangsbildes auf Farben im Ausgangsbild abzubilden. Dabei werden für jede Farbe im Eingangsbild zwei Werte Start-Faktor und End-Faktor eine Lineartransformation der jeweiligen Farbe benötigt. Ist die eingeladene Datei also im RGB-Farbmodell, so werden 6 Werte benötigt. Bei CMYK hingegen 8.

Für ein RGB-Bild müsste decodearray={1 0 1 0 1 0} die Farben invertieren, da es den Wertebereich aller Farben umkehrt, es wird also der kleinste mögliche Wert auf den größten möglichen Wert abgebildet und umgekehrt. Wenn man weiß, dass example-image.jpg RGB-Farben enthält, dann kann man das auch einfach testen:

Öffne in Overleaf
\documentclass{article}

\usepackage{graphicx}
\usepackage{mwe}

\begin{document}
\includegraphics[decodearray={1 0 1 0 1 0}]{example-image.jpg}
\end{document}

invertiertes example-image

Funktioniert. Keine Veränderung würde man entsprechend mit dem Array {0 1 0 1 0 1} erhalten. Mit {0 0 0 0 0 1} würde hingegen der hellgraue Hintergrund tief blau, weil alle Werte für Rot und Gelb auf die 0 abgebildet werden, während die Werte für Blau ihren normalen Farbraum erhalten. Soll einfach jeder Farbwert für Blau auf Blau abgebildet werden, dann wäre das das Paar 1 1. Mit {0 0 0 0 1 1} würde dann example-image.jpg zu einer blauen Fläche entarten, weil einfach jeder Farbwert zu reinem Blau würde.

Für ein Bild mit CMYK-Farben müsste man entsprechend 8 Paare angeben. Der Array {0.2 0.2 1 0 1 0.8 1 0} würde dann alle Cyan-Werte auf den Wert 0.2 abbilden. Magenta würde invertiert (der kleinste Wert wird auf den größten abgebildet, der größte auf den kleinsten), Yellow wird invertiert aber gleichzeitig extrem verstärkt, weil der kleinste Gelb-Wert nun das Maximum an Gelb ist und der größte Werte 80% Gelb, Schwarz wird ebenfalls invertiert.

Angenommen, das Ausgangsbild liegt als CMYK (oder cmyk) vor und soll auf Grauwerte abgebildet werden, dann müsste das mit decodearray={0 0 0 0 0 0 0 1} gelingen. Leider funktioniert das nicht und die Ursache mag verblüffen. Wenn wir uns das erzeugte PDF anschauen, dann finden wir im entsprechenden Objekt, zwei decode arrays:

/Decode[0 0 0 0 0 0 0 1] /Type /XObject /Subtype /Image /Width 100 /Height 100 /BitsPerComponent 8 /Length 11182 /ColorSpace /DeviceCMYK /Decode [1 0 1 0 1 0 1 0] /Filter /DCTDecode

und der letzte gewinnt. Tatsächlich muss nämlich für CMYK pdftex selbst bereits eine Invertierung vornehmen, weil sonst die Farben für JPEGs nicht stimmen. Das ist höchst ärgerlich, verhindert es doch die Verwendung von decodearray für CMYK-Bilder. Man könnte nun natürlich das PDF editieren, in obigem Objekt die Zeile /Decode [1 0 1 0 1 0 1 0] durch /Decode [0 0 0 0 0 0 1 0] ersetzen und so die Farben entfernen, aber wer will schon das PDF editieren (zumal man höllisch aufpassen muss, dabei die Anzahl Bytes nicht zu verändern). Da ist es schon besser, eine Umwandlung aller relevanten Bilder beispielsweise mit convert von ImageMagick vorzunehmen.

Für RGB-Bilder wiederum kann man via decodearray die Farben ohnehin nicht heraus nehmen, weil man nicht beispielsweise festlegen kann: Bilde die Werte für Grün und Blau auf denselben Wert ab wie Rot. Grauwerte gibt es aber bei RGB nur, wenn die Werte für R, G und B identisch sind (leichte Abweichungen werden zwar gerne für Antialiasing-Effekte verwendet, das funktioniert aber in erster Linie, weil wir schlechter sehen als die Mathematik vorgibt).

Permanenter link

beantwortet 23 Mai, 14:51

saputello's gravatar image

saputello
10.0k53458

bearbeitet 24 Mai, 02:50

1

Hinsichtlich cmyk Bildern: Mit low-level code kann man es hinkriegen: https://tex.stackexchange.com/a/433286/2388

(25 Mai, 03:45) Ulrike Fischer
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×19

Frage gestellt: 20 Mai, 06:57

Frage wurde angeschaut: 457 Mal

Zuletzt aktualisiert: 25 Mai, 03:45