6

PostScript コードに画像を追加したい

%!PS-Adobe-3.0

/Times-Roman findfont
12 scalefont setfont

50 700 moveto
(text) show
showpage

しかし、私はそれをする考えがありません。誰か助けて?

4

3 に答える 3

8

;tldr

途中までスキップして、Simpler Workflowから最後まで読み始めてください。

xbm に変換し、vi でハックし、インライン データを{currentfile} image

Postscript Language Reference Manualに文書化されていますが、情報を消化するのは少し難しい場合があります。

imageKen が言うように、演算子を使用する必要があります。私は通常、「古い学校」のフォームを使用します。

幅 高さ ピクセルあたりのビット数 行列 proc   画像   ‐</p>

ランダムな画像ファイルの場合、通常convert、ImageMagick のようなものを使用してテキスト形式を取得します。もちろん、それを単に eps に変換することもできますが、学ぶためには、指を挿入する必要があります。

% convert image.png image.xbm

これにより、次のようなファイルが得られます。

  1 #define glasses_width 320
  2 #define glasses_height 240
  3 static char glasses_bits[] = {
  4   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  5   0x00, 0x00, 0x00, 0x00, 0x45, 0x65, 0xDB, 0x65, 0xB5, 0x6F, 0xBF, 0xEF,
  6   0xFF, 0xFF, 0xFF, 0xBF, 0xB5, 0xED, 0x3C, 0xBF, 0xB3, 0xDB, 0xAD, 0xF6,
  7   0xE6, 0x4A, 0xAA, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
  8   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xA8, 0x66, 0xD6,
  9   0xDF, 0xF9, 0xF7, 0xBF, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0x7F, 0xFB, 0xEA,
 10   0xDD, 0x5A, 0x9A, 0x69, 0xB9, 0xBE, 0x55, 0x65, 0x00, 0x00, 0x00, 0x00,
...
803   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804   };

したがって、vi では、次のようないくつかのことを行います。

:%s/^#/%#/         #comment-out the #defines
:g/[{}]/d          #delete the array brackets
:%s/0x//g          #remove the 0x prefixes
:%s/, //g          #remove the spaces

このようなものを与える:

  1 %#define glasses_width 320
  2 %#define glasses_height 240 
  3   000000000003000000000000
  4   000000004565DB65B56FBFEF
  5   FFFFFFBFB5ED3CBFB3DBADF6
  6   E64AAABA0000000000020000
  7   000000000000000099A866D6
  8   DFF9F7BFFFFDFFFEFF7FFBEA
  9   DD5A9A69B9BE556500000000
 10   000C00000000000000000000
...
802   000000000000000000000000

次に、image呼び出しで番号を使用し、それらの行もトリミングし、これらの行の直後にデータを挿入します

%width height depth [ x-scale x-skew y-skew y-scale x-offset y-offset ]=matrix 
320    240    1     [ 1       0      0      -1      0        240 ]
%  {proc-yielding-string-data}                  call(image)
   { currentfile 80 string readhexstring pop }  image

これは、ビットマップ データの y が下向きに増加していることを前提としています。このアプローチは、生のサンプルの何らかのダンプを取得できる限り、他の ascii 形式に合わせて微調整できます。デコーダ コードを含む圧縮画像を埋め込むことは、ワームの大きな原因です。しばらくは避けることをお勧めします。(ほとんどの場合、これを行う方法がまだわからないためです。私は大きな缶のワームのようにそれを避けてきました。:D)


上記のアドバイスを確認しましたが、忘れていた大きな障害があります。Postscript は、ビッグ エンディアン バイトのビットマップが好きです。つまり、ビット 7 が左端、ビット 0 が右端です。これは xbm 形式の逆です。したがって、上記で紹介した完成したプログラムは次のとおりです。

%!
%reverse the bits in a byte
/reverse {               % b
    dup 1 and            % b b0          % explode the bits
    1 index 2 and        % b b0 b1
    2 index 4 and        % b b0 b1 b2
    3 index 8 and        % b b0 b1 b2 b3
    4 index 16 and       % b b0 b1 b2 b3 b4
    5 index 32 and       % b b0 b1 b2 b3 b4 b5
    6 index 64 and       % b b0 b1 b2 b3 b4 b5 b6
    8 7 roll 128 and     % b0 b1 b2 b3 b4 b5 b6 b7
    -7 bitshift exch     % b0 b1 b2 b3 b4 b5 b7-7=0' b6  % shift and combine
    -5 bitshift or exch  % b0 b1 b2 b3 b4 b0'|b6-5=1' b5
    -3 bitshift or exch  % b0 b1 b2 b3 b0'|b1'|b5-3=2' b4
    -1 bitshift or exch  % b0 b1 b2 b0'|b1'|b2'|b4-1=3' b3
    1 bitshift or exch   % b0 b1 b0'|b1'|b2'|b3'|b3+1=4' b2
    3 bitshift or exch   % b0 b0'|b1'|b2'|b3'|b4'|b2+3=5' b1
    5 bitshift or exch   % b0'|b1'|b2'|b3'|b4'|b5'|b1+5=6' b0
    7 bitshift or        % b0'|b1'|b2'|b3'|b4'|b5'|b6'|b0+7=7'
} def

320 240 1  % width height bitdepth
[ 1 0 0 -1 0 240 ]  % 1-to-1 matrix with descending y, offset by max_y
{ %proc-yielding-string
    currentfile 80 string  % file string
    readhexstring pop  % string         read a line of hex data from THIS FILE
    0 1 2 index length 1 sub  % string 0 1 strlen-1
    {  % string index
        2 copy 2 copy  % str i str i str i
        get reverse    % str i str i rev(str_i)
        put  % str' i
        pop % str'                      % reverse each char (byte)
    } for                               % loop over chars in string
} image
  000000000003000000000000
  000000004565DB65B56FBFEF
  FFFFFFBFB5ED3CBFB3DBADF6
  E64AAABA0000000000020000
  000000000000000099A866D6
  DFF9F7BFFFFDFFFEFF7FFBEA
  ...

ここに完全な画像データが追加された完全なプログラムが利用可能です。


よりシンプルなワークフロー

より簡単ですが、それでも「実践的」なのは、pbmポストスクリプトと同じビット順序規則を使用する に変換することです。次にxxd -ps、「postscript」hexdump を生成します。次の 3 つの例はすべて、この方法で準備された 16 進データを使用しています。ただし、この方法では、ヘッダーの長さを手動で測定する必要があります (xxd幅と高さの後の空白文字の後のバイト オフセットを見つけるために使用します)。

%!
% swar.ps
%
%image example
%image origin:  http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Spacewar%21-PDP-1-20070512.jpg/320px-Spacewar%21-PDP-1-20070512.jpg
%
% bash commands to prepare image file:
%
% $ wget http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Spacewar%21-PDP-1-20070512.jpg/320px-Spacewar%21-PDP-1-20070512.jpg
% $ identify 320px-Spacewar\!-PDP-1-20070512.jpg 
% $ convert 320px-Spacewar\!-PDP-1-20070512.jpg spacewar.pbm
% $ xxd -ps spacewar.pbm > spacewar.asc
% % gs swar.ps


/infile (spacewar.asc)(r)file def
/buf 256 string def

% use $ xxd spacewar.pbm | head
% to find the length of the header and read that length
% into the buffer and discard, leaving only samples.
infile buf 0 16#5d getinterval readhexstring pop pop 

320 215 1
[ 1 0 0 -1 0 215 ]
{ infile buf readhexstring pop } image

showpage

これspacewar.ascは、裸の 16 進サンプルの同じ醜いブロックです。

$ head spacewar.asc
50340a2346696c6520736f757263653a20687474703a2f2f636f6d6d6f6e
732e77696b696d656469612e6f72672f77696b692f46696c653a53706163
65776172212d5044502d312d32303037303531322e6a70670a3332302032
31350a007fffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffffdfffffff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
ffffffffffff803fffffffffffffffffffffffffffffffffffffffffffff
ffffff007ffffffffffffffffffffffff800ffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffff7fe007ff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff

このサンプル ブロックは、インタープリター (またはディスティラー) に SAFER オプションが設定されていない限り、外部のままにしておくことができます。これにより、ファイル アクセス オペレーターが無効になります。

上記のように使用して、イメージ呼び出しの後にインライン化することもできますcurrentfile

%!
/buf 256 string def

320 215 1
[ 1 0 0 -1 0 215 ]
{ currentfile buf readhexstring pop }
{ 
    infile buf 0 16#5d getinterval readhexstring pop pop  % discard header
    image 
} exec
50340a2346696c6520736f757263653a20687474703a2f2f636f6d6d6f6e
732e77696b696d656469612e6f72672f77696b692f46696c653a53706163
65776172212d5044502d312d32303037303531322e6a70670a3332302032
31350a007fffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffffdfffffff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
ffffffffffff803fffffffffffffffffffffffffffffffffffffffffffff
ffffff007ffffffffffffffffffffffff800ffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffff7fe007ff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
%...

または、データが 64k 未満である限り、文字列に丸呑みすることができます。[ 注: これは、文字列のサイズに関する歴史的な実装上の制限です。Ghostscript の現在のバージョンでは、より大きな文字列を問題なく処理できるとのことです。] これは、ドキュメント内で画像を何度も再利用したい場合に便利です。

%!
/imgbuf 320 215 mul 8 div ceiling cvi string def   % create a string for byte storage (<64k)

{ 
    currentfile imgbuf 0 16#5d getinterval readhexstring pop pop  % read header
    currentfile imgbuf readhexstring pop pop                 % read data (discarding header data)
} exec
50340a2346696c6520736f757263653a20687474703a2f2f636f6d6d6f6e
732e77696b696d656469612e6f72672f77696b692f46696c653a53706163
65776172212d5044502d312d32303037303531322e6a70670a3332302032
31350a007fffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffffdfffffff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
ffffffffffff803fffffffffffffffffffffffffffffffffffffffffffff
ffffff007ffffffffffffffffffffffff800ffffffffffffffffffffffff
ffffffffffffffffffffffffff007fffffffffffffffffffffff7fe007ff
ffffffffffffffffffffffffffffffffffffffffffffff007fffffffffff
%...

320 215 1
[ 1 0 0 -1 0 215 ]
{ imgbuf }
image

先ほど少し触れました (行列の引数)...

上記のすべてのコードで、私は PLRM の解釈をかなり自由にしています。通常(私の経験では)プロセスを理解するのを邪魔するだけなので、基本的にいくつかの一般的なアドバイスを無視しますが、ここでは...

演算子を使用するための推奨される方法は、image上に示したものとは異なる種類の行列を使用することです。行列は実際にはimageオペレーターによってマップとして解釈されます。つまり、スケールアップするには数値を小さくし、スケールダウンするには数値を大きくします。これを使用する方法は次のとおりです (上記の最後の例を変更します。これは、この例では最短であり、十分に考慮されているためです。つまりimgbuf、上記のように が入力されていると仮定しますreadhexstring)。この呼び出しは、より適切に記述する必要があります。

320 215 scale  % scale 1x1 image to proper dimensions
320 215 1          % "data" dimensions: w h bit-depth
[ 320 0 0 -215 0 215 ]              % inverse mapping
{ imgbuf }   % data-acquisition (yield data in a string)
image

つまり、マトリックスは(ここでは、技術的な意味ではなく、「ねじれ」という詩的な意味で) イメージを 1 単位 X 1 単位の正方形に反転しますシステムを使用して、画像の 1 ピクセルあたり 1 ポイントのレンダリングを取得します。適切なアプローチにより、柔軟性が向上320 215 scaleします。1 ピクセルから 1 ポイントへのマッピングだけが必要な場合は、自分で繰り返すことを犠牲にして、賢明なスケーリング計算を行うための行ができました。

適切なコードで画像のサイズを 2 倍にするには、単純に に置き換える320 215 scale(640 430 scaleまたは を追加する2 2 scale) だけです。

320 215 scale
2 2 scale % == 640 430 scale
320 215 1                           % w h bit-depth
[ 320 0 0 -215 0 215 ]              % inverse mapping
{ imgbuf }   % data-acquisition
image

しかし、ハック的な方法では、の成長を得るために、実際には行列を半分にする必要があります。:D

320 215 1
[ .5 0 0 -.5 0 430 ] % "doubled,inverted (ie. halved) with double-offset" matrix
{ imgbuf }
image
于 2013-03-03T08:26:43.713 に答える
3

PostScript言語リファレンスマニュアルを参照してください。これは些細なことではないため、注意深く読む必要があります。セクション4.10から始めて、少なくともタイプ1の画像(4.10.1から4.10.5)を扱っているセクションを読んでください。

簡単な例を次に示します。

/OneComponentString <007ff700> def

/OneComponentImage1
{
<<
/ImageType 1
/Width 2
/Height 2
/ImageMatrix [2 0 0 -2 0 2]
/BitsPerComponent 8
/Decode [0 1]
/DataSource OneComponentString
>>
} bind def

gsave
0 0 moveto
20 20 scale
/DeviceGray setcolorspace
OneComponentImage1 image
grestore

showpage
于 2013-03-01T22:08:20.640 に答える