GNU pokeを使ってみる(簡単な画像ファイルの修正)
はじめに
最近GNU pokeというバイナリエディタがあることを知りました。
ちょっと使えると便利そうなので
簡単な使用方法を記載してみます。
ドキュメント
ドキュメントは以下
後は、以下のページも参考になりそうです。
使用例
ここでは簡単な例として
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ファイルの書き方は、ドキュメントと
以下にファイルがあるので、こちらも参考になるかと思います。
今回は以下のように作成をしました。
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
内で定義したPBM
とsample.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結果が変化していることがわかります。
(0aa8
が0aff
に変わっている)
(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ライン目がすべて黒になっています。
まとめ
今回は単純な画像ファイルの修正を行ってみましたが、
使いようによっては他のファイルの確認、修正でも役に立つのではないでしょうか。
以下を見ると、いろいろなファイルの定義がるので
参考になるかと思います。
Discussion