[C++] 79 FLTK : 画像加工アプリにPythonモジュール導入 / Pillow

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

画像加工アプリにPythonのライブラリPillowの機能を導入し、単色アイコンの色変更ができるようにしました。

今回で2度目のPythonモジュール導入になり、引数が1つから5つに増えています。比較的スムーズに実装できました。

OpenCVを使えばC++で同じ機能を実装できるはずですが、開発速度を優先しました。追々OpenCVに切り替えるつもりです。

久しぶりにFinal Cut Pro試用版を使いましたが、プロジェクトの再生時に画質が悪くなるのは仕様あるいはスペック不足のせいでしょうか。画面全体にモザイクが掛かったのかと勘違いしました。

ピクセル化を選択した後に範囲を狭めたにもかかわらずこうなってしまうのは明らかに不具合じゃないかと思います。3ヶ月後に36800円を払うか、無料のDaVinci Resolveに変更するか迷いどころです。

#define PY_SSIZE_T_CLEAN
#include "colorConvert.h"
#include </Library/Frameworks/Python.framework/Versions/3.10/include/python3.10/Python.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>

using std::string; using std::to_string;
using std::cout; using std::endl;

int colorConvert(const char* path, int red, int green, int blue, const char* name) {
    Py_Initialize();

    // pyファイルの指定(imageColorConvert.py)
    PyObject* myModuleString = PyUnicode_FromString((char*)"imageColorConvert");

    // pyファイルのモジュール化
    PyObject* myModule = PyImport_Import(myModuleString);

    // pyファイル内の関数を指定
    PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"color_convert");

    // 関数の引数を設定(5個)
    PyObject* args = PyTuple_Pack(5,PyUnicode_FromString(path),PyUnicode_FromString((to_string(red)).c_str()),PyUnicode_FromString((to_string(green)).c_str()),PyUnicode_FromString((to_string(blue)).c_str()),PyUnicode_FromString(name));

    // 関数を実行
    PyObject* myResult = PyObject_CallObject(myFunction,args);

    return 0;

    Py_Finalize();
}
#include "split.h" // 自製文字列分割関数を含むsplitクラス

class split spt; // 自製クラスのオブジェクト化

void color_convert_func(){
    const char *path = input_line->value();
    const char *name = name_input->value();
    const char *rgb = rgb_input->value();

    string rgb_str = string(rgb);
    vector<string> list_rgb = spt.splits(rgb_str, ',');
    
    string red0 = list_rgb[0];
    string green0 = list_rgb[1];
    string blue0 = list_rgb[2];

    cout << "red0 " << red0 << endl;
    cout << "green0 " << green0 << endl;
    cout << "blue0 " << blue0 << endl;

    vector<string> list_red = spt.splits(red0, '(');
    vector<string> list_blue = spt.splits(blue0, ')');

    int red = stoi(list_red[1]);
    int green = stoi(green0);
    int blue = stoi(list_blue[0]);

    cout << "red " << red << endl;
    cout << "green " << green << endl;
    cout << "blue " << blue << endl;

    colorConvert(path,red,green,blue,name); // Pythonモジュール

    output_line->insert("colorConvert is success!\n");
    cout << "colorConvert is success!" << endl;

}
--------------------------------------------------
出力例:
RGB(106,90,205)から数字を抽出しPythonモジュールの引数として使用
--------------------------------------------------
red0 RGB(106
green0 90
blue0 205)
red 106
green 90
blue 205
colorConvert is success!

[Python]333 pngファイルを単色で塗りつぶす / Pillow

[M1 Mac, Big Sur 11.6.7, Python 3.10.4]

単色アイコンの色を変えるために関数を作成しました。

これで単色であれば一々Adobe XDを立ち上げアイコンを作らなくて済みます。

for文の内容を変えれば特定の色だけ変更することも可能です。

Pythonならスケッチ感覚でコーディングできるので本当に楽ですね。

from PIL import Image
import numpy as np

def color_convert(path,red,green,blue,name="color"):
    # pngファイルの色情報を読み込む [red, green, blue, alpha]
    img_array = np.array(Image.open(path))

    # 全画素のRGB値を変更
    for row in img_array:
        for pixel in row:
            np.put(pixel,0,red)
            np.put(pixel,1,green)
            np.put(pixel,2,blue)
                
    img = Image.fromarray(img_array)

    new_filename0 = path.split("/")[:-1]
    new_filename = '/'.join(new_filename0) + "/" + name + ".png"
    img.save(new_filename)
        
    return 0

if __name__ == '__main__':
    path = "umemurasaki.png"
    color_convert(path,173,255,47,"greenyellow")