2017/04/20(木) [n年前の日記]
#2 [gimp][python][ubuntu] Ubuntu Linux 16.04LTS上でGIMPのPython-fuに関して試行錯誤中
VMware Player + Ubuntu Linux 16.04 LTS上で GIMP 2.8.16 を動かして、Python-Fuコンソール上でアレコレ実験中。
昨日、Windows10 x64上 + GIMP 2.8.20 Portable で、Python-fu の実験をした際には上手くいったのだけど、同じことを Ubuntu上で行うと、struct.unpack('@L', ) が以下のエラーを出すようで。
与えてる文字列は、こんな感じだけど…。
コレを struct.unpack() に渡すと…。
昨日、Windows10 x64上 + GIMP 2.8.20 Portable で、Python-fu の実験をした際には上手くいったのだけど、同じことを Ubuntu上で行うと、struct.unpack('@L', ) が以下のエラーを出すようで。
error: unpack requires a string argument of length 8
与えてる文字列は、こんな感じだけど…。
>>> ctx.set_source_rgb(1, 0, 0) >>> ctx.rectangle(0, 0, 64, 64) >>> ctx.fill() >>> src = surface.get_data() >>> src[0 : 4] '\x00\x00\xff\xff'別におかしくはないよなあ…。
コレを struct.unpack() に渡すと…。
>>> struct.unpack('@L', src[0:4]) Traceback (most recent call last): File "<input>", line 1, in <module> error: unpack requires a string argument of length 8なんでや。
◎ 書式文字列を変えてみた。 :
書式文字列を、「@L」から「=L」に変えてみたら、エラーが出ないことに気づいた。
_7.3. struct - 文字列データをパックされたバイナリデータとして解釈する - Python 2.7.13 ドキュメント
>>> struct.unpack('=L', src[0:4]) (4294901760,)
_7.3. struct - 文字列データをパックされたバイナリデータとして解釈する - Python 2.7.13 ドキュメント
- 「@」は、バイトオーダ、サイズ、アライメント、全部がネイティブ。
- 「=」は、バイトオーダはネイティブ、サイズは standard、アライメントは none。
◎ Python-Fuコンソール上で打ったアレコレをまとめて列挙。 :
from gimpfu import * import struct import cairo
def get_rgba_str(src): rgba_buf = "" l = len(src) for i in range(l / 4): i0 = i * 4 i1 = i0 + 4 bgra = struct.unpack('=L', src[i0: i1])[0] a = (bgra >> 24) & 0x0ff r = (bgra >> 16) & 0x0ff g = (bgra >> 8) & 0x0ff b = bgra & 0x0ff rgba = struct.pack('4B', r, g, b, a) rgba_buf += rgba return rgba_buf
img = gimp.Image(256, 256, RGB) gimp.Display(img) w = 64 h = 64 layer = gimp.Layer(img, "layer03", w, h, RGBA_IMAGE, 100, NORMAL_MODE) layer.fill(TRANSPARENT_FILL) img.add_layer(layer, 0) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) ctx = cairo.Context(surface) ctx.set_source_rgb(1, 0, 0) ctx.rectangle(8, 8, 32, 32) ctx.fill_preserve() ctx.set_source_rgb(0, 0, 0) ctx.stroke() src = surface.get_data() dst = get_rgba_str(src) rgn = layer.get_pixel_rgn(0, 0, w, h, True, True) rgn[0:w, 0:h] = str(dst) layer.flush() layer.merge_shadow() layer.update(0, 0, w, h) pdb.gimp_displays_flush()コレをGIMPのPython-Fuコンソールに貼り付ければ、cairoで描画した内容をGIMPのレイヤーに反映させられるかどうかが分かる。みたいな。
[ ツッコむ ]
以上です。