2011年4月13日水曜日

PIL で bin2png

ちょっと驚き... こちら blogger 然りでバイナリデータをブログに載せたい時って
どうすれば良いやら。長いテキストとかであれば a2ps | enscript で PostScript
にした後 ps2pdf とか。で PDF がアップロードできるか知らないし、やっぱイメー
ジデータでしょう。

と探すもステガノグラフィ (outguess steghide snowdrop) まで凝った話でもなく、
サイズも大きくなるし a2png だって? と試すもそのまま a2ps の png 版だったり。
sourceforge にあるも Java だったり...

むーん libpng とか使って自作? とか思い始めたところ # 長い前置き
Python Imaging Library (PIL) のハンドブック眺めてみたところ、ソレらしきメソ
ッドが。でお試し
$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> fname = "patch-2.6.38.2.gz"
>>> import os
>>> os.stat(fname).st_size
52847
>>> f = open(fname)
>>> b = bytearray()
>>> b.extend(f.read())
>>> len(b)
52847
>>> import Image
>>> im = Image.new('L', (52847, 1))
>>> im.putdata(b)
>>> im.save("2.6.38.2.png")
>>> (Ctrl-D)
$ ls -l 2.6.38.2.png 
-rw-r--r-- 1 chamaken chamaken 52921 2011-04-12 23:35 2.6.38.2.png
PNG フォーマットとか全く知らないので new() のモードわからないし、最大約数を
探すのも面倒がってサイズもおかしいど、もちろん可逆で
$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Image
>>> im = Image.open("2.6.38.2.png")
>>> f = open("write.back", 'wb')
>>> f.write(bytearray(im.getdata()))
>>> f.close()
>>> (Ctrl-d)
$ cmp patch-2.6.38.2.gz write.back 
$ 
おどろいた。この 2.6.38.2.png を貼ると大変なことになりそうなので超てきとー
いいかげんにパディングしたものを貼ってみるテスト

0 件のコメント: