[C++] 54 FLTK : 画像加工アプリ / iOSアプリ用iconset作成機能の実装 appiconset

とりあえずmacOSアプリとiOSアプリに必要なアイコン類を作成できるようにしました。画像処理ライブラリとしてOpenCV(開発はインテル)を使っています。用意するのは2048*2048のpngファイルだけです。

iOSに必要なContents.jsonは前もってホームディレクトリに配置したものをコピーしました。

iOS
macOS
#include <opencv2/opencv.hpp>

void makeIcnsIOS(const char* filename){
	// AppIcon.appiconsetパス作成
	string path_str = string(filename);
	char del = '/';
	vector<string> list = split(path_str, del);
	string imagename = list.back(); 
	list.pop_back();

	const char* del2 = "/";
	string prefix = join(list,del2);
	string dir = prefix + "/" + "AppIcon.appiconset";

	cout<<"dir "<<dir<<endl;

	// iconsetディレクトリ作成
	mkdir(dir.c_str(),
		S_IRUSR | S_IWUSR | S_IXUSR |  // USR RWX
		S_IRGRP | S_IWGRP | S_IXGRP |  // GRP RWX
		S_IROTH | S_IWOTH | S_IXOTH);  // OTH RWX

	// 各種pngファイル作成
	int pixels[19] = {20, 29, 40, 50, 57, 58, 60, 72, 76, 80, 87, 100, 114, 120, 144, 152, 167, 180, 1024};
	string filenames[19] = {"20.png","29.png","40.png","50.png","57.png","58.png","60.png","72.png","76.png","80.png","87.png","100.png","114.png","120.png","144.png","152.png","167.png","180.png","1024.png"};
	
	int num = 0;
	for (int pixel:pixels){
		cv::Mat img,img_resize;
		img = cv::imread(filename,cv::IMREAD_UNCHANGED);
		cv::resize(img,img_resize, cv::Size(pixel,pixel),0,0,cv::INTER_LINEAR);
		// リサイズファイルパス作成
		string filename2 = filenames[num];
		string filepath = dir + "/" + filename2;
		cv::imwrite(filepath, img_resize);

		num += 1;
	}

	// JSONファイルコピー
	std::string jsonname1 = "/Users/[ユーザID]/ImageInspector/Contents.json";
    std::string jsonname2 = prefix + "/AppIcon.appiconset/Contents.json";
	system(("cp " + jsonname1 + " " + jsonname2).c_str());
}

[C++] 53 FLTK : 画像加工アプリ / iOSアプリ用iconset作成機能の実装 Fl_Choice

[M1 Mac, Big Sur 11.6.5, FLTK 1.3.8]

macOSアプリ, iOSアプリではアイコン登録に必要な画像ファイル数、サイズおよびファイルタイプが異なるため、都度選択し作成できるよう自製アプリの機能追加に着手しました。XCodeへのiOSアプリ登録に必要なのは正確にはicnsファイルではなくappiconsetフォルダです。

まずはガワだけ、プルダウンメニューを配置しました。中身はこれから書きます。

<該当箇所のみ>

Fl_Choice *choice;

// icnsタイプ選択項目
Fl_Menu_Item icns_type[3] = {
    {"macOS"},
    {"iOS"},
};

// icnsタイプ選択メニュー
choice = new Fl_Choice(135, 90, 80, 20, nullptr);
choice->menu(icns_type);

[C++] 52 FLTK : findコマンド生成アプリ/ FL_Menu_Itemの設定ミス その2

[M1 Mac, Big Sur 11.6.5, FLTK 1.3.8]

前回の続きです。

FL_Menu_Itemの配列の書き方でイテレータの存在を忘れていて修正を施しましたが、コードの見た目がいまひとつなので以下のように書き換えました。

Fl_Menu_Item pulldown[4] = {
  {"and"},
  {"or"},
  {"not"}
};

実際のアイテム数3に最後のヌルポインタを加えた4を記述する必要があります。こちらの方がすっきりしている感じがします。公式サイトにあるような複雑なメニューであれば最後に0を書くでしょう。

Fl_Menu_Item popup[] = {
 {"&alpha",    FL_ALT+'a', the_cb, (void*)1},
 {"&beta",     FL_ALT+'b', the_cb, (void*)2},
 {"gamma",     FL_ALT+'c', the_cb, (void*)3, FL_MENU_DIVIDER},
 {"&strange",  0,          strange_cb},
 {"&charm",    0,          charm_cb},
 {"&truth",    0,          truth_cb},
 {"b&eauty",   0,          beauty_cb},
 {"sub&menu",  0,          0, 0, FL_SUBMENU},
 {"one"},
 {"two"},
 {"three"},
 {0},
 {"inactive", FL_ALT+'i', 0, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER},
 {"invisible",FL_ALT+'i', 0, 0, FL_MENU_INVISIBLE},
 {"check",    FL_ALT+'i', 0, 0, FL_MENU_TOGGLE|FL_MENU_VALUE},
 {"box",      FL_ALT+'i', 0, 0, FL_MENU_TOGGLE},
 {0}};

お遊びで私のアプリにこの複雑なメニューを実装してみました。余談ですが、今になって何故altキーの記号が⎇なのかが理解できました。確かに左から右にまっすぐ進まずもう一方に変わっている様子で意味が伝わります。

それにしてもMontereyでは何故間違ったコードでも動いたのか、謎です。