やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GIMP Python-fu で矩形描画

 丸パクリ。

前提

情報源

 感謝。

手順

  1. GIMP起動
  2. メニュー FilstersPython-fuコンソールクリック
  3. 以下のコードをペーストして実行する
from gimpfu import *
img = gimp.Image(512, 512, RGB)
layer = gimp.Layer(img, "layer01", 512, 512, RGBA_IMAGE, 100, NORMAL_MODE)
layer.fill(TRANSPARENT_FILL)
img.add_layer(layer, 0) 
gimp.Display(img)

import cairo
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 512, 512)
ctx = cairo.Context(surface)
ctx.set_source_rgb(1.0, 0.0, 0.0)
ctx.rectangle(128, 128, 256, 256)
ctx.fill()

import struct
def get_rgba_str(bgra_buf):
    rgba_buf = ""
    l = len(bgra_buf)
    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

src = surface.get_data()
dst = get_rgba_str(src)
rgn = layer.get_pixel_rgn(0, 0, 512, 512, True, True)
rgn[0:512, 0:512] = str(dst)
layer.flush()
layer.merge_shadow()
layer.update(0, 0, 512, 512)
pdb.gimp_displays_flush()

f:id:ytyaru:20191217183503p:plain

所感

 やっと動作確認できた。

 それにしてもビット操作か……。仕様もわからんし難しすぎる。パクらないと動作確認すらできない。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux