.pbm file image render - [vhold] scanline-wiggles?

I am trying to hack a program to read a pbm, pgm or ppm file and display the image on the postscript output device using an operator image. Just test the input stream P4(binary portable (1 bit) bitmap), but my output is all creepy.

%!
% 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

I am sure that the problem is that my calculation of the byte width of the string and the expected addition:

/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 =

But that seems right when I find it. For this 215-bit bitmap, I get 27 bytes per line.

Edit: removing the "pad" -chop helps. Perhaps I need to add an additional add-on?

The problem is shown in the output:

improved but still bad

If a similar, but simpler program from the end of this answer is displayed normally.

ok image

0
1

, , .

:

 55 token pop /width exch def
 56 token pop /height exch def

, :

215 27 .

identify. , 215 - , .

image fixed

0

All Articles