🚌

GNU pokeを使ってみる(簡単な画像ファイルの修正)

2021/05/23に公開

はじめに

最近GNU pokeというバイナリエディタがあることを知りました。
http://www.jemarch.net/poke

ちょっと使えると便利そうなので
簡単な使用方法を記載してみます。

ドキュメント

ドキュメントは以下
http://www.jemarch.net/poke-1.2-manual/

後は、以下のページも参考になりそうです。
https://pokology.org/

使用例

ここでは簡単な例として
PBMフォーマットの画像を修正してみます。

テスト用の画像を作成

以下のように5x5ピクセルの格子状の画像を用意します。
私はgimpで作成しました。

PBM形式でエクスポートするときにRAWにして保存をします。

ファイル名はsample.pbmとします。

gnu pokeのビルド

最新は V1.2のようだったのでこちらを使用しました。

$ wget https://ftp.gnu.org/gnu/poke/poke-1.2.tar.gz

ビルド、インストールは以下のようにすればできました。

$ mkdir build
$ cd !$
$ ../configure
$ make
$ sudo make install

/configure実行時に以下のようなワーニング、エラーが出たりしましたが、
必要なパッケージが入っていなかったようなので都度sudo apt install ***をして
configureでエラーが出ないようにしました。

configure: WARNING: libtextstyle was not found in the system. Poke's output won't be styled.
configure: WARNING: building poke without NBD io space support.
     Install libnbd to use it.
configure: WARNING: building poke without the machine interface support.
     Install libjson-c and use --enable-mi to activate it.
configure: WARNING: building poke without GUI support.
     Install tcl-dev and tk-dev and use --enable-gui to activate it.
configure: error: can't find the Boehm GC library.  Please install it.

参考として、インストールしたパッケージを記載します(結構無駄なものも入れているかも...)

$ sudo apt install libbo
$ sudo apt install libmonoboehm-2.0-dev 
$ sudo apt install libgc-dev
$ sudo apt install gettext
$ sudo apt install libnbd-dev libjson-c-dev tcl-dev tk-dev

gnu pokeの実行

poke ファイル名でpokeが起動します。
以下のようにロゴが出力された後に(poke)プロンプトが表示されます。

$ poke sample.pbm 
     _____
 ---'   __\_______
            ______)  GNU poke 1.2
            __)
           __)
 ---._______)

Copyright (C) 2019-2021 The poke authors.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Powered by Jitter 0.9.263.
Perpetrated by Jose E. Marchesi.

hserver listening in port 50571.

For help, type: ".help".
Type ".exit" to leave the program.
(poke) 

dumpと入力すると、ダンプ結果が出力されます
今回のファイルは5x5のモノクロの画像ファイルなので以下の出力結果が
ファイルの内容全てです。

(poke) dump 
76543210  0011 2233 4455 6677 8899 aabb ccdd eeff  0123456789ABCDEF
00000000: 5034 0a23 2043 7265 6174 6564 2062 7920  P4.# Created by 
00000010: 4749 4d50 2076 6572 7369 6f6e 2032 2e31  GIMP version 2.1
00000020: 302e 3138 2050 4e4d 2070 6c75 672d 696e  0.18 PNM plug-in
00000030: 0a35 2035 0aa8 50a8 50a8                 .5 5..P.P.

ファイルの内容は以下のようになります。

内容 備考
P4 Portable bitmap(バイナリ形式)
0x0a
# Created by GIMP version 2.10.18 PNM plug-in gimpで作成するとこのように出力されるようです
0x0a
0x35 サイズ(幅)
0x20 スペース
0x35 サイズ(高さ)
0x0a
ピクセルデータ

詳細はこちらを確認してください。

ピクセルデータの操作

試しにピクセルのデータを修正してみます。

picklesファイルの作成

pokeではpicklesというファイル(拡張子は*.pk)にスクリプトを書けて、
それをpokeにロードすることができます。

picklesファイルの書き方は、ドキュメント
以下にファイルがあるので、こちらも参考になるかと思います。
https://git.savannah.gnu.org/cgit/poke.git/tree/pickles

今回は以下のように作成をしました。

pbm.pk
type PBM =
  struct
  {
    byte[2] magic = ['P','4'];
    byte; /* skip.  */
    char[45] comment; /* # Created by GIMP version 2.10.18 PNM plug-in */
    byte; /* skip.  */
    byte[1] width; /* width = 5*/
    byte; /* skip.  */
    byte[1] height; /* height = 5*/
    byte; /* skip.  */
    byte[5] lines;
  };

上記ファイルをpokeでロードします。

(poke) .load ~/pbm.pk 

pbm.pk内で定義したPBMsample.pbmの内容を関連付けます。
結果は pbmに保持されます。

(poke) var pbm = PBM @ 0#b

これで pbmの内容を表示すると以下のようになります。

(poke) pbm 
PBM {magic=[80UB,52UB],10UB,comment=[35UB,32UB,67UB,114UB,101UB,97UB,116UB,101UB,100UB,32UB,98UB,121UB,32UB,71UB,73UB,77UB,80UB,32UB,118UB,101UB,114UB,115UB,105UB,111UB,110UB,32UB,50UB,46UB,49UB,48UB,46UB,49UB,56UB,32UB,80UB,78UB,77UB,32UB,112UB,108UB,117UB,103UB,45UB,105UB,110UB],10UB,width=[53UB],32UB,height=[53UB],10UB,lines=[168UB,80UB,168UB,80UB,168UB]}
(poke) 

ピクセルデータのみを出力してみます。
以下のようにfor文, printfが使用できます。(詳細はキュメント参照)

(poke) for ( x in pbm.lines) printf("%i8b\n",x);
10101000B
01010000B
10101000B
01010000B
10101000B
(poke) 

ピクセルの書き換え

試しに、1ライン目のピクセルをすべて黒にしてみます。
以下のようにすると、一行目がすべて黒になります。

(poke) pbm.lines[0] = 0xff

変更前と、変更後のdump結果が変化していることがわかります。
(0aa80affに変わっている)

(poke) dump 
<省略>
00000030: 0a35 2035 0aa8 50a8 50a8                 .5 5..P.P.
(poke) pbm.lines[0] = 0xff
(poke) dump 
<省略>
00000030: 0a35 2035 0aff 50a8 50a8                 .5 5..P.P.
(poke) 

これで値が書き換わったので、
pokeを終了します。
終了コマンドは.quitです

(poke) .quit 
$

gimpでファイルを開いてみると
1ライン目がすべて黒になっています。

まとめ

今回は単純な画像ファイルの修正を行ってみましたが、
使いようによっては他のファイルの確認、修正でも役に立つのではないでしょうか。

以下を見ると、いろいろなファイルの定義がるので
参考になるかと思います。
https://git.savannah.gnu.org/cgit/poke.git/tree/pickles

Discussion