zip 書庫の中にある画像を表示したい。
もちろん展開ファイルを作らずメモリ内でやりくり。
って Gjs ではどうすればいいんだ?
Java なら ZipInputStream という便利なクラスがあるんだが。
ホイール欲しい ハンドル欲しい ? データ圧縮 zlib と gzip と zip (zlib で zip にアクセスする)
zlib でできるっぽい、サイト名が関係なさすぎでワロタ。
Gio で zlib はアクセスできるはず。
Projects/Vala/GIOCompressionSample – GNOME Wiki!
Vala コードだけど gir なら同様に扱えるはず。
ということでこんなコードを書いてみた。
#!/usr/bin/gjs const Gtk = imports.gi.Gtk; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; const Lang = imports.lang; const GdkPixbuf = imports.gi.GdkPixbuf; //const PATH = "akazukin.zip"; const PATH = "akazukin.gz"; const UnzipTestWin = new Lang.Class({ Name: 'UnzipTestWin', Extends: Gtk.ApplicationWindow, _init: function(app) { this.parent({ application: app }); // Read gzip file let source = Gio.File.new_for_path(PATH); let stream = source.read(null); let converter = new Gio.ZlibDecompressor({ //format: Gio.ZlibCompressorFormat.RAW format: Gio.ZlibCompressorFormat.GZIP }); let cnv_stream = new Gio.ConverterInputStream ({ base_stream: stream, converter: converter }); // Create Pixbuf let pixbuf = GdkPixbuf.Pixbuf.new_from_stream(cnv_stream, null); let image = new Gtk.Image({ pixbuf: pixbuf }); this.add(image); this.show_all(); } }); const UnzipApp = new Lang.Class({ Name: 'UnzipApp', Extends: Gtk.Application, _init: function() { GLib.set_prgname("UnzipApp"); this.parent({ application_id: 'org.sasakima.unzip', flags: Gio.ApplicationFlags.FLAGS_NONE }); }, vfunc_activate: function() { new UnzipTestWin(this); } }); let application = new UnzipApp(); application.run(null);
gzip は上手くいったけど zip はダメだ。
そんなに甘くはなかった、いや筆者が無知なだけかも。
てか gzip は普通 tar とセットだ、tar も展開しないと…
いや違うだろ、zip でなきゃ意味が無いんだ。
何を作ろうとしているかバレバレ臭いのは気にしない。
ええい面倒だ、Python3 の zipfile を使ってしまえ!
スクリプト言語の速度で大丈夫かな?試してみるべ。
#!/usr/bin/env python3 import sys, zipfile, gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gio, GLib, GdkPixbuf PATH = "なえコレ.zip"; class UnzipTestWin(Gtk.ApplicationWindow): def __init__(self, app): Gtk.ApplicationWindow.__init__(self, application=app) fbox = Gtk.FlowBox(valign=Gtk.Align.START, min_children_per_line=5) datas = [] # unzip with zipfile.ZipFile(PATH) as f: l = f.namelist() for name in l: d = f.read(name) datas.append(d) for data in datas: stream = Gio.MemoryInputStream.new_from_data(data) p = GdkPixbuf.Pixbuf.new_from_stream(stream) minp = p.scale_simple(80, 100, GdkPixbuf.InterpType.BILINEAR) image = Gtk.Image(pixbuf=minp) fbox.add(image) self.add(fbox) self.show_all() class UnzipApp(Gtk.Application): def __init__(self): GLib.set_prgname("UnzipApp"); Gtk.Application.__init__( self, application_id="apps.test.naecore", flags=Gio.ApplicationFlags.FLAGS_NONE ) def do_activate(self): UnzipTestWin(self) app = UnzipApp() app.run(sys.argv)
なんだ一瞬だった。
これなら速度も問題ないし簡単だし Python で作ることにしよう。
しかし PyGObject でもプロパティ指定がすっかり Gjs 風になってしまった。