Imagemagick usado para gerar PPM's no Linux, os PPM's são ilegíveis

2

Eu preciso gerar PPMs como fontes de dados brutos para um programa. Eu tenho um monte de png como entrada, que eu vou converter ppm. Quando eu tento uma ferramenta como mogrify , gera arquivos, mas estes são ilegíveis para qualquer programa de visualização de imagens, como o GIMP:

mogrify -format ppm *.png

Eu instalei o pacote netpbm . Eu tentei abrir alguns outros PPM aleatórios de outros lugares, qualquer visualizador de imagens pode abrir e ler esses arquivos, o problema existe com meus próprios arquivos gerados. Os arquivos criados com mogrify parecem ter o tamanho correto para sua resolução e contêm bits.

No cabeçalho do arquivo de trabalho do visualizador de arquivos hexadecimal parece:

P6 640 480 25

Mina gerada com o Imagemagick:

P7 WIDTH 640 HEIGHT 480 DEPTH 3 MAXVAL 255 TUPLTYPE RGB ENDHD

Provavelmente eu preciso dar Imagemagick alguns outros parâmetros para fazer o formato de arquivo correto, mas o que? Ou existe outra ferramenta que pode facilmente converter png's em ppm?

    
por IBr 29.05.2013 / 15:32

1 resposta

4

Se você der uma olhada nas páginas da Wikipédia para PPM e PAM diz que os números mágicos para o PPM são os seguintes:

trecho da página de wikipedia do PPM

Each file starts with a two-byte magic number (in ASCII) that explains the type of file it is (PBM, PGM, and PPM) and its encoding (ASCII or binary). The magic number is a capital P followed by a single digit number.

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

Considerando que, com o formato PAM, seu número mágico é P7. Também foram as seguintes diferenças dos formatos mais antigos (PPM, PNM, PGM, PBM):

excerto da página da Wikipédia do PAM

The header for the PAM file format begins with P7, and (unlike in the other formats) ends in an explicit close: ENDHDR.

There is no plain (human-readable, ASCII-based) version of PAM. PAM files are always binary, and attempts to use the switch -plain with Netpbm programs that produce PAM output results in an error message.

For the black-and-white version of PAM (depth 1, tuple type BLACKANDWHITE), corresponding to PBM, PAM uses one byte per pixel, instead of PBM’s use of one bit per pixel (packing eight pixels in one byte). Also, the value 1 in such a PAM image stands for white (“light on”), as opposed to black in PBM (“ink on”).

Exemplo

Se eu converter um arquivo PNG em um arquivo PPM usando mogrify , obtenho o seguinte:

converter blah.png para blah.ppm:

mogrify -format ppm blah.png

informações do arquivo:

$ 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

identificar informações:

$ 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

informações do cabeçalho hexadecimal:

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

Como você pode ver, mogrify gerou corretamente um arquivo PPM (veja o P6).

Então, o que há de errado?

Gostaria de saber se há algo especial em suas imagens de origem que você está convertendo para o PPM, que o formato PPM não suporta, e que o mogrify não é capaz de lidar com isso automaticamente.

Eu sugeriria interrogar a imagem de origem usando o comando identify :

identify <original image>
Editar # 1

O OP postou a imagem original aqui . Executando essa imagem por mim mesmo, não consegui reproduzir o resultado, onde mogrify retornaria um arquivo PAM em vez de um arquivo PPM.

gerado ppm:

mogrify -format ppm some.png

original png & novos arquivos 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

informações do cabeçalho dos arquivos:

$ 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

O arquivo foi convertido com sucesso para mim. A execução de display some.ppm exibiu o arquivo, então não tenho certeza do que fazer com isso. Eu notei que o comando de identificação do OP mostrava os arquivos como sRGB enquanto no meu sistema esses arquivos aparecem como "8-bit DirectClass ". As diferenças entre esses 2 são detalhadas aqui , mas não tenho certeza do que fazer com isso.

Ao pesquisar isso, deparei com vários segmentos em que havia bugs no ImageMagick relacionados a sRBG e PNG. Veja um link para um exemplo .

    
por 30.05.2013 / 03:58