coding Shift_JIS; // 文字コードの明示(文字化け予防) import Graphics; // 画像処理に必要なライブラリの読み込み import File; // ファイルやフォルダの情報を扱うライブラリの読み込み import Text; // 文字列の操作や判定などに必要なライブラリの読み込み import Math; // 数学関数ライブラリの読み込み(ユーザーが条件式内で使えるように) // 入出力フォルダのパスのデフォルト値 const string DEFAULT_INPUT_DIRECTORY = "./input"; const string DEFAULT_OUTPUT_DIRECTORY = "./output"; // 変換する色の条件式をユーザーに入力してもらう string condition = input("透明化する色の条件は?", "(r < 50 && g >= 80) || b > 100"); // 変換後の色(透明以外の色にしたい場合はここを書き換える) int toRed = 0; // 赤成分 int toGreen = 0; // 青成分 int toBlue = 0; // 緑成分 int toAlpha = 0; // 不透明度(0で完全な透明、255で完全な不透明) // ================================================== // 全体的な処理 - この関数は起動時に自動で実行されます // ================================================== void main () { // 入出力フォルダのフルパスを用意 string inputDirectoryPath = getFilePath(DEFAULT_INPUT_DIRECTORY); string outputDirectoryPath = getFilePath(DEFAULT_OUTPUT_DIRECTORY); // 入出力フォルダをデフォルトから変更するかユーザーに尋ね、必要なら変更 if (confirm("入力先/出力先フォルダを指定しますか?(「いいえ」でデフォルトの場所使用)")) { inputDirectoryPath = choose("入力先フォルダを選択", "."); outputDirectoryPath = choose("出力先フォルダを選択", "."); } // 入力先フォルダ内の全ファイルを処理し、出力先フォルダに保存 processAllFiles(inputDirectoryPath, outputDirectoryPath); // 完了メッセージをユーザーに表示 pop("完了しました。画面上のファイル一覧を確認の上、ウィンドウを閉じてください。"); } // ================================================== // フォルダ内の全ファイルを走査して処理する関数 // ================================================== void processAllFiles(string inputDirectoryPath, string outputDirectoryPath) { // 入力フォルダ内にあるファイル名の一覧とファイル個数を取得 string fileNames[] = listDirectory(inputDirectoryPath); int fileN = length(fileNames); // 入力フォルダ内にある個々のファイルについて処理 for (int i=0; i OUTPUT: " + outputFilePath); // 色の透明化処理を実行 processFile(inputFilePath, outputFilePath); } } } // ================================================== // 画像ファイル1個を読み込み、透過処理して保存する関数 // ================================================== void processFile(string inputFilePath, string outputFilePath) { // 画像ファイルを開いてグラフィックスデータを生成 int inputGraphics = newGraphics(inputFilePath); // 画像の幅と高さ、および全ピクセルの赤,緑,青,α値を配列として取得 int width = getGraphicsWidth(inputGraphics); int height = getGraphicsHeight(inputGraphics); int pixel[][][] = getGraphicsPixel(inputGraphics); // インデックスは[Y][X][色] // メモリー節約のため、必要なデータを取得した後はグラフィックスデータを解放 deleteGraphics(inputGraphics); // 全ピクセルに対して、色を条件判定して置き換える処理を実行 for (int y=0; y < height; y++) { // 画像の縦方向へのピクセル単位のループ(上から下) for (int x=0; x < width; x++) { // 画像の横方向へのピクセル単位のループ(左から右) // このピクセル上での赤,緑,青,α成分を1文字変数に控える //(透明化の条件式を簡単に書けるようにするため) int r = pixel[y][x][0]; // 赤成分(0〜255) int g = pixel[y][x][1]; // 緑成分(0〜255) int b = pixel[y][x][2]; // 青成分(0〜255) int a = pixel[y][x][3]; // α成分(0〜255、0で完全な透明、255で完全な不透明) // ユーザーが入力した条件式(グローバル変数condition)が文法的に解釈可能か検査 if ( !evaluable(condition) ) { alert("条件を解釈できません。終了します..."); exit(); } // 条件式を評価し、このピクセルの色が透明化対象であるかどうかを bool 型変数に控える // (条件式が文法的に正しくても、値がbool型ではない場合はここで型変換エラーとなる) bool shouldReplaceColor = eval(condition); // 評価結果が true なら透明化対象なので、ピクセルの色を書き換える if (shouldReplaceColor) { pixel[y][x][0] = toRed; pixel[y][x][1] = toGreen; pixel[y][x][2] = toBlue; pixel[y][x][3] = toAlpha; } } } // 書き換えたピクセル配列を元にグラフィックスデータを生成 int outputGraphics = newGraphics(pixel); // グラフィックスデータの内容に、別のファイル名をつけて保存 exportGraphics(outputGraphics, outputFilePath, "PNG"); // PNG形式のファイルとして保存 // 保存が済んだグラフィックスデータもすぐ破棄 deleteGraphics(outputGraphics); }