ImageMagick에서 PDF를 PNG로 변환하는 중 오류가 발생했습니다.

ImageMagick에서 PDF를 PNG로 변환하는 중 오류가 발생했습니다.

Imagemagick 변환을 사용하여 다음과 같이 pdf 파일을 png로 변환합니다.

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

다음과 같이 경고합니다.

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

그리고 생성된 png 이미지는 모두 검은색입니다. 그러나 jpg 이미지로 변환하는 것은 괜찮습니다. 문제는 무엇입니까? 감사해요.

답변1

출력 파일 이름 앞에 -colorspace RGB를 추가해 보세요.

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

답변2

그만큼선적 서류 비치이렇게 말합니다:

PNG RW 휴대용 네트워크 그래픽 libpng-1.0.11 이상이 필요하며, libpng-1.2.5 이상이 권장됩니다. PNG 사양은 인치당 픽셀 단위를 지원하지 않고 센티미터당 픽셀 단위만 지원합니다. 특정 관련 이미지 프로필을 읽지 않으려면 -define profile:skip=name(예: profile:skip=ICC)을 사용하십시오.

따라서 출력파일 이름 앞에 -define profile:skip=ICC(또는 )을 추가해 보세요.skip="*"

또한보십시오:정의 명령에 대한 문서

답변3

ImageMagick 7.1.1-8을 사용하고 있는데 동일한 문제가 발생했습니다.

$ 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)
$ 

제 경우에는 ImageMagick(Ghostscript 사용)이 입력 PDF 파일을 읽고 ICC 프로필이 포함된 sRGB 색상 공간의 이미지 데이터를 생성합니다.

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

해당 이미지 데이터를 PNG 파일로 저장할 때 ImageMagick은 자동으로 색상 공간을 최적화하고 파일을 다음과 같은 회색조 PNG로 저장합니다.색상 유형 0:

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

하지만 그렇습니다~ 아니다내장된 ICC 프로파일을 제거하십시오:

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

이것이 경고의 내용입니다. libpng는 다음을 기대하지 않습니다.색상ICC 프로파일이 포함되어 있습니다.회색조PNG.

경고를 없애려면 다음 중 하나를 수행하세요.

  1. ICC 프로필을 유지하지만 일반적으로 경고를 숨깁니다.
  2. ICC 프로필을 제거하거나
  3. ICC 프로필을 유지하고 그레이스케일 PNG로 저장하지 마세요.

ICC 프로필을 유지하지만 일반적으로 경고를 숨깁니다.

단순히 경고를 숨기려면 -quiet옵션을 사용하세요. 결국 이는 오류가 아니라 경고일 뿐입니다.

$ magick example.pdf -quiet output.png
$ 

단점은 나중에 다른 경고가 표시되더라도 이미 해당 경고를 숨기고 있기 때문에 알아차리지 못할 수 있다는 것입니다.

ICC 프로필 제거

대신 ICC 프로필을 제거하도록 선택할 수 있습니다. 그렇게 하는 방법에는 여러 가지가 있습니다. 예를 들어 다른 답변에서는 색상 공간 변경에 대해 언급합니다. ImageMagick은 색상 공간을 변경할 때 내장된 프로필을 자동으로 제거하기 때문에 (때때로) 작동합니다.

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

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

이 접근 방식에는 두 가지 단점이 있습니다.

  1. 이미지가 이미 색상 공간 sRGB에 있고 -colorspace sRGB색상 공간 sRGB로 변환하는 데 사용하는 경우 ImageMagick은 연산자를 무시하므로 프로필이 제거되지 않습니다. 예를 들어 입력 PDF 파일은 sRGB 색상 공간의 이미지를 생성했는데 이는 -colorspace sRGB효과가 없으며 프로필이 제거되지 않음을 의미합니다.

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

    -colorspace RGB반대로 이미 RGB 색상 공간에 있는 이미지에 를 사용하는 경우에도 마찬가지입니다 . 따라서 이 방법을 사용하여 ICC 프로파일을 제거하려면 이미지가 sRGB인지 RGB인지 미리 확인하고 그에 -colorspace따라 사용해야 합니다.

  2. -colorspace분명히 이미지의 색상 공간을 변경하는 데 사용하면 이미지의 색상이 변경되어 이미지가 다르게 보일 수 있습니다. 따라서 프로파일을 제거하기 위해 색공간을 다른 색공간으로 변환한 후에는 색공간을 다시 원래 색공간으로 변환해야 합니다. 따라서 귀하의 명령은 연산자를 두 번 사용합니다 -colorspace. sRGB인 예제 파일의 경우 먼저 RGB로 변환한 다음 다시 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:"
    $ 
    

    변환 시 약간의 반올림 오류가 발생할 수 있지만 이미지는 거의 동일하게 보입니다.

프로필을 제거하는 다른 방법은 간단히 다음을 사용하는 것입니다 -strip.

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

그러나 해당 옵션은 모든 프로필뿐만 아니라 추가 메타데이터도 제거하므로 바람직하지 않은 동작일 수 있습니다. 보다https://imagemagick.org/script/command-line-options.php#strip자세한 내용은.

저장하기 전에 이미지에서 ICC 프로파일을 구체적으로 제거하려면 다음을 사용할 수 있습니다 +profile icc.

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

또는 처음부터 입력 파일에서 ICC 프로파일을 읽지 않으려면 다음을 사용할 수 있습니다 -define profile:skip=icc.

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

이 설정은 영향을 미칩니다.독서이므로 입력 파일 앞에 넣어야 합니다.

ICC 프로필을 유지하고 회색조 PNG로 저장하지 않음

마지막으로 프로필을 유지하려면 -define png:color-type=원하는 PNG를 설정하는 데 사용할 수 있습니다.색상 유형회색조로의 자동 변환을 방지하여 경고를 방지합니다. 예제 파일의 경우 색상 유형 6인 "Truecolour with alpha"를 원할 수 있습니다.

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

또는 예를 들어 출력 접두사를 사용할 수 있습니다 PNG32:.

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

두 경우 모두 경고가 표시되지 않지만 ICC 프로필은 유지됩니다.

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

ImageMagick의 GitHub 토론 페이지에서 이 문제에 대한 자세한 내용을 읽을 수 있습니다.https://github.com/ImageMagick/ImageMagick/discussions/2730그리고https://github.com/ImageMagick/ImageMagick/discussions/6292탁월한 지원을 제공합니다.

관련 정보