Imagemagick은 Linux에서 PPM을 생성하는 데 사용되며 PPM을 읽을 수 없습니다.

Imagemagick은 Linux에서 PPM을 생성하는 데 사용되며 PPM을 읽을 수 없습니다.

프로그램의 원시 데이터 소스로 PPM을 생성해야 합니다. 입력으로 png 파일이 많이 있고 이를ppm으로 변환하겠습니다. 유사한 도구를 사용하려고 하면 mogrify어떤 이미지 뷰어 프로그램(예: GIMP)에서도 읽을 수 없는 파일이 생성됩니다.

mogrify -format ppm *.png

netpbm패키지를 설치했습니다 . 다른 곳에서 임의의 다른 PPM을 열어 보았으며 모든 이미지 뷰어에서 이러한 파일을 열고 읽을 수 있습니다. 직접 생성한 파일에 문제가 있습니다. 를 사용하여 생성된 파일은 mogrify해당 해상도에 적합한 크기로 보이며 비트를 포함합니다.

Hex 파일 뷰어에서 작업 파일 헤더는 다음과 같습니다.

P6 640 480 25

Imagemagick을 사용하여 다음을 생성했습니다.

P7 너비 640 높이 480 깊이 3 MAXVAL 255 TUPLTYPE RGB ENDHD

어쩌면 파일 형식을 올바르게 만들기 위해 Imagemagick에 다른 매개 변수를 제공해야 할 수도 있습니다. 하지만 어떻게 될까요? 아니면 png를ppm으로 쉽게 변환할 수 있는 다른 도구가 있습니까?

답변1

위키피디아 페이지를 보면생산계획관리그리고폴리아크릴아미드PPM의 매직 넘버는 다음과 같습니다.

에서 발췌PPM 위키피디아 페이지

각 파일은 파일 유형(PBM, PGM 및 PPM)과 인코딩(ASCII 또는 바이너리)을 설명하는 2바이트 매직 넘버(ASCII 형식)로 시작됩니다. 매직 넘버는 대문자 P 뒤에 단일 숫자가 오는 형식입니다.

Magic Number    Type           Encoding
P1           Portable bitmap    ASCII
P2           Portable graymap   ASCII
P3           Portable pixmap    ASCII
P4           Portable bitmap    Binary
P5           Portable graymap   Binary
P6           Portable pixmap    Binary

PAM 형식의 매직 넘버는 P7입니다. 이전 형식(PPM, PNM, PGM, PBM)과 비교하면 다음과 같은 차이점도 있습니다.

에서 발췌PAM 위키피디아 페이지

PAM 파일 형식의 헤더는 P7으로 시작하고 (다른 형식과 달리) 명시적인 종결자: ENDHDR로 끝납니다.

PAM의 간단한(사람이 읽을 수 있는, ASCII 기반) 버전은 없습니다. PAM 파일은 항상 바이너리이며 PAM 출력을 생성하는 Netpbm 프로그램에서 -plain 스위치를 사용하려고 하면 오류 메시지가 나타납니다.

PBM에 해당하는 흑백 버전의 PAM(깊이 1, 튜플 유형 BLACKANDWHITE)의 경우 PAM은 픽셀당 1비트(1바이트에 8픽셀을 압축)를 사용하는 PBM 대신 픽셀당 1바이트를 사용합니다. 또한 PAM 이미지에서 값 1은 PBM의 검정색("어두움")과 달리 흰색("밝음")을 나타냅니다.

mogrify다음 명령을 사용하여 PNG 파일을 PPM 파일로 변환하는 경우:

blah.png를 blah.ppm으로 변환:

mogrify -format ppm blah.png

파일 정보:

$ ll |grep bla
-rw-rw-r--   1 saml saml      11870 May 29 21:36 blah.png
-rw-rw-r--   1 saml saml     530613 May 29 21:36 blah.ppm

식별 정보:

$ identify blah.png blah.ppm 
blah.png PNG 926x191 926x191+0+0 8-bit DirectClass 11.9KB 0.000u 0:00.000
blah.ppm[1] PNM 926x191 926x191+0+0 8-bit DirectClass 531KB 0.000u 0:00.000

16진수 헤더 정보:

$ xxd blah.ppm|head -3
0000000: 5036 0a39 3236 2031 3931 0a32 3535 0af2  P6.926 191.255..
0000010: f1f0 0000 0000 0000 0000 0000 0000 0000  ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................

$ xxd blah.png |head -3
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
0000010: 0000 039e 0000 00bf 0802 0000 0019 f594  ................
0000020: be00 0000 0373 4249 5408 0808 dbe1 4fe0  .....sBIT.....O.

보시다시피 mogrifyPPM 파일이 올바르게 생성되었습니다(P6 참조).

그럼 무엇이 잘못됐나요?

PPM 형식이 지원하지 않고 mogrify가 자동으로 처리할 수 없는 PPM으로 변환하려는 소스 이미지에 특별한 점이 있는지 궁금합니다.

identify소스 이미지를 조사하려면 다음 명령을 사용하는 것이 좋습니다 .

identify <original image>
편집 #1

OP가 원본 이미지를 게시했습니다.여기. mogrifyPPM 파일 대신 PAM 파일이 반환되는 이 이미지를 직접 실행하여 그의 결과를 재현할 수는 없습니다 .

생성된ppm:

mogrify -format ppm some.png

원본 png 및 새ppm 파일:

 ll|grep some
-rw-rw-r-- 1 saml saml     387940 May 30 00:36 some.png
-rw-rw-r-- 1 saml saml     921615 May 30 07:00 some.ppm

$ identify some.p*
some.png PNG 640x480 640x480+0+0 8-bit DirectClass 388KB 0.000u 0:00.000
some.ppm[1] PNM 640x480 640x480+0+0 8-bit DirectClass 922KB 0.000u 0:00.009

파일 헤더 정보:

$ xxd some.png |head -3
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
0000010: 0000 0280 0000 01e0 0802 0000 00ba b34b  ...............K
0000020: b300 0020 0049 4441 5478 0184 c181 b21c  ... .IDATx......

$ xxd some.ppm |head -3
0000000: 5036 0a36 3430 2034 3830 0a32 3535 0a65  P6.640 480.255.e
0000010: 6e6b 656e 6b62 6e6a 626e 6a5f 706a 5f70  nkenkbnjbnj_pj_p
0000020: 6a5e 726b 5e72 6b5a 6d66 596c 6559 6a64  j^rk^rkZmfYleYjd

파일이 성공적으로 변환되었습니다. 실행하면 display some.ppm파일이 표시되므로 무엇을 해야할지 모르겠습니다. 나는 OP의 식별 명령이 파일을 sRGB로 표시하는 반면 내 시스템에서는 이 파일이 "8비트 DirectClass"를 표시한다는 것을 알았습니다. 이 둘의 차이점은자세한 내용은 여기, 하지만 어떻게 해야 할지 모르겠습니다.

이 문제를 조사하는 동안 sRBG 및 PNG와 관련된 ImageMagick에 버그가 있는 여러 스레드를 발견했습니다. 이것은예시 링크.

관련 정보