NetPBM을 사용하여 변환할 때 PNG 이미지 유형(RGB 또는 인덱스)을 유지하는 방법은 무엇입니까?

NetPBM을 사용하여 변환할 때 PNG 이미지 유형(RGB 또는 인덱스)을 유지하는 방법은 무엇입니까?

24비트 트루컬러 형식의 이미지(RGB 이미지라고도 함)를 사용하는 PNG 이미지 처리 워크플로가 있습니다. PNG는 RGB 또는 인덱스 색상 표현을 허용합니다.

NetPBM의 프로그램은 pnmtopng이미지의 다양한 색상 수에 따라 작성할 이미지 유형을 자동으로 결정합니다. 이 숫자가 256 이하이면 자동으로 인덱스 이미지를 쓴다는 내용을 어디선가 읽은 기억이 납니다.

이미지 유형을 보존하는 방법이 있습니까?

예를 들어 아래와 같이 NetPBM을 사용하여 이미지를 뒤집으면

pngtopnm true-color-image.png | pamflip -tb | pnmtopng > new-image.png

새 이미지도 트루 컬러 이미지인지 확인할 수 있는 방법이 있습니까?

현재 이미지 크기가 원본 이미지보다 50% 정도 작아서 잘못된 유형임을 확인할 수 있습니다.

37155 true-color-image.png
27463 new-image.png

새 이미지의 크기가 원본 이미지와 거의 같기를 원합니다.

identifyImageMagick은 또한 이 두 이미지에 대해 다음 정보를 제공합니다.

true-color-image.png PNG 300x280 300x280+0+0 8-bit sRGB 37155B
new-image.png PNG 300x280 300x280+0+0 8-bit sRGB 61c 27463B

답변1

해결책을 찾았습니다PNG: 최종 가이드(5장)저자: 그렉 로엘로프스

그것은 말한다:

주의 깊은 독자라면 GIF 이미지가 항상 팔레트 기반이라는 점을 기억할 것입니다. 그러나 NetPBM 형식을 설명할 때 팔레트에 대해서는 언급하지 않았습니다. 실제로 NetPBM에는 팔레트 개념이 없습니다. Giftopnm은 일반적으로 GIF 이미지를 PPM 형식(RGB 스타일)으로 변환합니다. 다행히 pnmtopng는 이미지의 색상을 계산할 만큼 똑똑하고 색상 수가 256개 이하일 때 자동으로 팔레트 기반 PNG 이미지를 작성합니다. 또한 컬러 이미지가 실제로 회색조 값으로만 ​​구성되어 있는지 여부도 감지합니다. 이 경우 가장 적은 비트로 쓸 수 있는 값에 따라 회색조 PNG 또는 팔레트 기반 PNG를 씁니다. 그러나 이 자동 검사에는 비용이 듭니다. 모든 픽셀을 검사해야 하기 때문에 큰 이미지의 경우 매우 느릴 수 있습니다. 따라서 pnmtopng에는 다음이 포함됩니다.-힘검사를 건너뛰는 옵션입니다.

따라서 옵션을 도입하는 주요 목적은 -force변환 속도를 높이는 것입니다. 내 경우에는 호환성을 보장하는 데 도움이 됩니다.

pngtopnm true-color-image.png | pamflip -tb | pnmtopng > flipped-indexed.png
pngtopnm true-color-image.png | pamflip -tb | pnmtopng -force > flipped-truecolor.png

실행하면 identify옵션이 예상대로 작동하는지 확인됩니다.

flipped-indexed.png PNG 300x280 300x280+0+0 8-bit sRGB 61c 27463B 0.000u 0:00.000
flipped-truecolor.png PNG 300x280 300x280+0+0 8-bit sRGB 37038B 0.000u 0:00.000

완전성을 위해 여기에 완전한 예가 있습니다.

# 1. Generate a green/blue two color image
ppmrough -left 30 -right 30 -top 30 -bottom 30 -width 300 -height 280 \
         -var 5 -bg green -fg blue > twocolor.ppm
# 2. Convert to PNG
pnmtopng twocolor.ppm > twocolor-indexed.png
# 3. Convert to PNG forcing Truecolor output
pnmtopng -force twocolor.ppm > twocolor-truecolor.png
# 4. Checking the results
identify twocolor-indexed.png twocolor-truecolor.png

그러면 두 개의 PNG 이미지가 생성됩니다. 하나는 2색 인덱스 팔레트이고 다른 하나는 트루컬러 PNG입니다.

twocolor-indexed.png PNG 300x280 300x280+0+0 8-bit sRGB 2c 1018B 0.000u 0:00.000
twocolor-truecolor.png PNG 300x280 300x280+0+0 8-bit sRGB 2421B 0.000u 0:00.000

답변2

이것은 나에게 XY 문제처럼 보입니다.

png는 정보 내용을 줄이거나 변경하지 않고 가능한 가장 작은 방법으로 이미지를 저장하도록 설계된 압축 이미지 형식입니다. 이미지의 색상이 256개 이하인 경우 RGB 데이터 손실 없이 인덱스로 저장할 수 있습니다.

응용 프로그램이 적절한 라이브러리를 사용하여 이미지를 읽는 경우 해당 형식이 색인 형식인지 트루컬러 형식인지는 중요하지 않습니다. 어느 쪽이든 이미지의 픽셀에 대해 동일한 원시 데이터를 얻어야 합니다. 손으로 작성한 png 디코더가 인덱스 이미지를 처리할 수 없다면 라이브러리로 전환하는 것이 좋습니다.

색인화되지 않은 원시 RGB 이미지를 정말로 원한다면 png 대신에 ppm으로 변환해야 합니다.

관련 정보