やってみる

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

GIMP python-fu xcfファイル保存

 xcfはGIMP専用バイナリ形式。

前回まで

手順

  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)

from datetime import datetime
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
out_path = "/tmp/work/" + timestamp + ".xcf"
pdb.gimp_xcf_save(0,img,layer,out_path,out_path)
gimp.message("ファイル保存しました。: " + out_path)

pdb.gimp_displays_flush()

 /tmp/work配下に現在日時でyyyymmddHHMMSS.xcfファイルが出力される。

所感

 これをCLIで実行したい。いちいちGIMPpython-fuから実行するの面倒。

対象環境

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