Визуализация файла.pbm - [vhold] scanline-wiggles?

Я пытаюсь взломать программу для чтения файла pbm, pgm или ppm и рендеринга изображения на устройство вывода postscript с помощью image оператор. Просто тестирую 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 бит я получаю 27 байтов на строку.

Редактировать: удаление "pad"-chop помогает. Возможно, мне нужно добавить дополнительные отступы?

Проблема демонстрируется в выводе:

улучшилось, но все еще плохо

Где похожая, но более простая программа с конца этого ответа выдает ок.

хорошо изображение

1 ответ

Решение

О, дорогой, это было глупо.

У меня были эти 2 строки провалились:

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

Все это пришло ко мне во время последнего редактирования, где я напечатал:

Для этого растрового изображения шириной 215 бит я получаю 27 байтов на строку.

А потом я снова посмотрел на identify выход. Конечно, 215- это высота, а не ширина.

изображение исправлено

Другие вопросы по тегам