Fehler beim Konvertieren einer PDF-Datei in eine PNG-Datei in ImageMagick

Fehler beim Konvertieren einer PDF-Datei in eine PNG-Datei in ImageMagick

Ich verwende Imagemagick Convert, um PDF-Dateien wie folgt in PNG umzuwandeln:

Magick convert -density 300 PointOnLine.pdf -quality 90 PointOnLine.png

Es gibt eine Warnung:

convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `PointOnLine.png' @ warning/png.c/MagickPNGWarningHandler/1744.

Und das erstellte PNG-Bild ist ganz schwarz. Die Konvertierung in ein JPG-Bild funktioniert jedoch problemlos. Was ist das Problem? Danke.

Antwort1

Versuchen Sie, vor dem Ausgabedateinamen -colorspace RGB hinzuzufügen.

convert -density 300 PointOnLine.pdf -quality 90 -colorspace RGB PointOnLine.png

Antwort2

DerDokumentationsagt dies:

PNG RW Portable Network Graphics erfordert libpng-1.0.11 oder höher, libpng-1.2.5 oder höher empfohlen. Die PNG-Spezifikation unterstützt keine Pixel-pro-Zoll-Einheiten, nur Pixel-pro-Zentimeter. Um das Lesen eines bestimmten verknüpften Bildprofils zu vermeiden, verwenden Sie -define profile:skip=name (z. B. profile:skip=ICC).

Versuchen Sie daher , vor dem Namen der Ausgabedatei -define profile:skip=ICC(oder ) hinzuzufügen .skip="*"

Siehe auch:Dokumentation zum Befehl „define“

Antwort3

Ich verwende ImageMagick 7.1.1-8 und hatte gerade dasselbe Problem:

$ magick example.pdf output.png
magick: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG `output.png' @ warning/png.c/MagickPNGWarningHandler/1526.
$ magick -version
Version: ImageMagick 7.1.1-8 Q16-HDRI x86_64 d92cb0e65:20230421 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5) 
Delegates (built-in): bzlib djvu fontconfig freetype heic jbig jng jpeg lcms lqr lzma openexr png raqm tiff webp x xml zlib
Compiler: gcc (7.5)
$ 

In meinem Fall liest ImageMagick (mit Ghostscript) meine PDF-Eingabedatei und erstellt Bilddaten im sRGB-Farbraum mit einem eingebetteten ICC-Profil:

$ magick example.pdf -verbose info: | grep "Colorspace:"
  Colorspace: sRGB
$ magick example.pdf -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

Beim Speichern der Bilddaten als PNG-Datei optimiert ImageMagick automatisch den Farbraum und speichert die Datei als Graustufen-PNG mitFarbtyp 0:

$ magick output.png -verbose info: | grep "Colorspace:"
  Colorspace: Gray
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 0 (Grayscale)
$ 

Aber es tutnichtEntfernen Sie das eingebettete ICC-Profil:

$ magick output.png -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

Darum geht es in der Warnung: libpng erwartet keineFarbeICC-Profil eingebettet in eineGraustufenPNG.

Um die Warnung loszuwerden, können wir entweder

  1. das ICC-Profil beibehalten, aber Warnungen generell ausblenden,
  2. das ICC-Profil entfernen oder
  3. Behalten Sie das ICC-Profil bei und speichern Sie nicht als Graustufen-PNG.

Behalten Sie das ICC-Profil bei, aber verbergen Sie Warnungen im Allgemeinen

Wenn Sie die Warnung einfach ausblenden möchten, verwenden Sie die -quietOption. Schließlich handelt es sich nicht um einen Fehler, sondern nur um eine Warnung:

$ magick example.pdf -quiet output.png
$ 

Ein Nachteil könnte darin bestehen, dass Sie es nicht bemerken, wenn in Zukunft weitere Warnungen angezeigt werden, weil Sie diese ebenfalls bereits verbergen.

Entfernen des ICC-Profils

Stattdessen können Sie das ICC-Profil entfernen. Dafür gibt es mehrere Möglichkeiten. In anderen Antworten wird beispielsweise das Ändern des Farbraums erwähnt. Dies funktioniert (manchmal), da ImageMagick eingebettete Profile automatisch entfernt, wenn der Farbraum geändert wird:

(void) DeleteImageProfile(image,"icc");
(void) DeleteImageProfile(image,"icm");

Quelle:https://github.com/ImageMagick/ImageMagick/blob/7a63f554dc0f986aa3ef2767d041a0f3294decd2/MagickCore/colorspace.c#L1624-L1625

Dieser Ansatz hat zwei Nachteile:

  1. Wenn Ihr Bild bereits im Farbraum sRGB vorliegt und Sie es -colorspace sRGBin den Farbraum sRGB konvertieren, ignoriert ImageMagick den Operator und das Profil wird daher nicht entfernt. Meine PDF-Eingabedatei hat beispielsweise ein Bild im Farbraum sRGB erzeugt, was bedeutet, dass -colorspace sRGBes keine Auswirkung hat und das Profil nicht entfernt:

    $ magick example.pdf -colorspace sRGB -verbose info: | grep -A1 "Profiles:"
      Profiles:
        Profile-icc: 2576 bytes
    $ 
    

    Umgekehrt gilt das Gleiche, wenn Sie es -colorspace RGBauf einem Bild anwenden, das bereits im RGB-Farbraum vorliegt. Wenn Sie also diese Methode verwenden möchten, um das ICC-Profil zu entfernen, müssten Sie im Voraus prüfen, ob Ihr Bild in sRGB oder RGB vorliegt und es dann -colorspaceentsprechend anwenden.

  2. Wenn Sie -colorspaceden Farbraum Ihres Bildes ändern, können sich natürlich die Farben Ihres Bildes ändern, wodurch das Bild anders aussieht. Daher sollten Sie nach der Konvertierung des Farbraums in einen anderen Farbraum zum Entfernen des Profils den Farbraum wieder in den ursprünglichen Farbraum konvertieren. Ihr Befehl verwendet den -colorspaceOperator also zweimal. Für meine Beispieldatei, die sRGB ist, konvertiere ich zuerst in RGB und dann zurück in sRGB:

    $ magick example.pdf -colorspace RGB -colorspace sRGB -verbose info: | grep "Colorspace:"
      Colorspace: sRGB
    $ magick example.pdf -colorspace RGB -colorspace sRGB -verbose info: | grep -A1 "Profiles:"
    $ 
    

    Bei den Konvertierungen treten wahrscheinlich immer noch einige Rundungsfehler auf, das Bild wird jedoch mehr oder weniger identisch aussehen.

Eine alternative Möglichkeit zum Entfernen des Profils besteht darin, einfach Folgendes zu verwenden -strip:

$ magick example.pdf -strip -verbose info: | grep -A1 "Profiles:"
$ 

Allerdings werden mit dieser Option nicht nur alle Profile, sondern auch weitere Metadaten entfernt, was möglicherweise nicht erwünscht ist. Siehehttps://imagemagick.org/script/command-line-options.php#stripfür mehr Informationen.

Um das ICC-Profil vor dem Speichern gezielt aus dem Bild zu entfernen, können Sie Folgendes verwenden +profile icc:

$ magick example.pdf +profile icc -verbose info: | grep -A1 "Profiles:"
$ 

Alternativ können Sie, um gezielt gar kein ICC-Profil aus der Eingabedatei zu lesen, Folgendes verwenden -define profile:skip=icc:

$ magick -define profile:skip=icc example.pdf -verbose info: | grep -A1 "Profiles:"
$ 

Beachten Sie, dass diese EinstellungLektüre, also müssen Sie es vor Ihre Eingabedatei einfügen.

Behalten Sie das ICC-Profil bei und speichern Sie es nicht als Graustufen-PNG

Wenn Sie das Profil beibehalten möchten, können Sie -define png:color-type=mit das gewünschte PNG festlegen.Farbtypum die automatische Konvertierung in Graustufen und damit die Warnung zu vermeiden. Für meine Beispieldatei möchte ich vielleicht „Truecolour mit Alpha“, also Farbtyp 6:

$ magick example.pdf -define png:color-type=6 output.png
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 6 (RGBA)
$

Alternativ können Sie beispielsweise das PNG32:Ausgabepräfix verwenden:

$ magick example.pdf PNG32:output.png
$ magick output.png -verbose info: | grep "color_type"
    png:IHDR.color_type: 6 (RGBA)
$ 

In beiden Fällen wird keine Warnung angezeigt, das ICC-Profil bleibt jedoch erhalten:

$ magick output.png -verbose info: | grep -A1 "Profiles:"
  Profiles:
    Profile-icc: 2576 bytes
$ 

Weitere Informationen zu diesem Problem finden Sie auf der GitHub-Diskussionsseite von ImageMagick unterhttps://github.com/ImageMagick/ImageMagick/discussions/2730Undhttps://github.com/ImageMagick/ImageMagick/discussions/6292die hervorragende Unterstützung bietet.

verwandte Informationen