image
pbm、pgm、または ppm ファイルを読み取り、オペレーターを使用して画像をポストスクリプト出力デバイスにレンダリングするプログラムをハックアップしようとしています。P4
入力(バイナリポータブル(1ビット)ビットマップ)パスをテストするだけですが、私の出力はすべて厄介です。
%!
% cf. http://en.wikipedia.org/wiki/Netpbm_format
% cf. http://en.wikipedia.org/wiki/Computer_Graphics (origin of image)
% $ wget http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Spacewar%21-PDP-1-20070512.jpg/320px-Spacewar%21-PDP-1-20070512.jpg
% $ convert 320px-Spacewar%21-PDP-1-20070512.jpg spacewar.pbm
% $ convert 320px-Spacewar%21-PDP-1-20070512.jpg spacewar.pgm
% $ convert 320px-Spacewar%21-PDP-1-20070512.jpg spacewar.ppm
/filename (spacewar.pbm) def
%/filename (spacewar.pgm) def
%/filename (spacewar.ppm) def
/infile filename (r) file def
/readscale false def
% Read magic number
infile token pop <<
/P1 { /depth 1 def
/readscale false def
/filetype /ascii def }
/P2 { /depth 8 def
/readscale true def
/filetype /ascii def }
/P3 { /depth 24 def
/readscale true def
/filetype /ascii def }
/P4 { /depth 1 def
/readscale false def
/filetype /binary def }
/P5 { /depth 8 def
/readscale true def
/filetype /binary def }
/P6 { /depth 24 def
/readscale true def
/filetype /binary def }
>> exch 2 copy known not{pop/default}if get exec
% Read header
/buf 256 string def
infile buf readline pop % line
(1:)print dup ==
(#) { % line (#)
(2a:)print 1 index =
search { % post (#) pre
pop pop pop %
infile buf readline pop % (#) next-line
(#) % next-line (#)
(2b pstack\n)print pstack()=
}{ % line
(2c:)print dup ==
exit
} ifelse
} loop % line
pstack()=
token pop /height exch def
token pop /width exch def
readscale {
token pop /scale exch def
}{
pop
}ifelse
/buf width
depth mul
8 div ceiling cvi
string def
(bufsize: )print buf length =
/pad
buf length 8 mul
width sub def
(pad: )print pad =
/readdata <<
/ascii { % file buf
0 1 width 1 sub { % file buf i
2 index token pop % file buf i
} for
}
/binary { % file buf
readstring pop
%dup length 0 ne { 0 1 index length pad sub getinterval } if
dup == flush
%(bin)= flush
}
>> filetype get def
%errordict/rangecheck{pstack dup length = quit}put
width
height
depth
[ 1 0 0 -1 0 height ]
{
infile buf readdata
} image
showpage
問題は、行のバイト幅と予想されるパディングの計算であると確信しています:
/buf width
depth mul
8 div ceiling cvi
string def
(bufsize: )print buf length =
/pad
buf length 8 mul
width sub def
(pad: )print pad =
しかし、私がそれを通り抜けるとき、それは正しいようです。この 215 ビット幅のビットマップでは、1 行あたり 27 バイトになります。
編集:「パッド」チョップを削除すると役立ちます。おそらく、余分なパディングを追加する必要がありますか?
この問題は出力に示されています。
この回答の最後にある同様の、しかしより単純なプログラムは問題ありません。