mieki256's diary



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', ) が以下のエラーを出すようで。
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」に変えてみたら、エラーが出ないことに気づいた。
>>> struct.unpack('=L', src[0:4])
(4294901760,)

_7.3. struct - 文字列データをパックされたバイナリデータとして解釈する - Python 2.7.13 ドキュメント
  • 「@」は、バイトオーダ、サイズ、アライメント、全部がネイティブ。
  • 「=」は、バイトオーダはネイティブ、サイズは standard、アライメントは none。
WindowsとUbuntuでは、このあたりのサイズだのアライメントだのが違ってる、ということなんだろうか。

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のレイヤーに反映させられるかどうかが分かる。みたいな。

以上です。

過去ログ表示

Prev - 2017/04 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project