ブログ用 画像ユーティリティ ② コマンドライン引数の処理
コマンドライン引数の処理にはApplication.Startupイベントの記事を利用します。
App.xamlにスタートアップ メソッド名を追加して(app_Startup)、App.xaml.csでそのメソッドを実装します。VgaBitmapは後述する画像用のコンテナクラスです。内容は単にコマンドラインからファイル名を取得し、VgaBitmapをコンストラクトして、Saveメソッドを呼び出して保存し、this.Shutdown()を呼び出して終了するだけです。
最初はWindows1.xaml.csで同じことをやっていたのですが、ウィンドウを開いてすぐ閉じると、表示するWPFコンポーネントとBimapImageコンストラクションとの衝突があるのか、BitmapImage関連の例外を投げるときがあったので、App.xaml.csだけで処理することにしました。
この実装では何も表示せずサイレントに終わってしまうので、メッセージボックスとか、音とか、アニメーションがあったほうが正しいUXのような気もします。この使い方のときは、複数画像をドラッグすると全て処理します(起動してからは、ウィンドウに表示できるのが1つの画像だけなので、処理できるのも1画像だけです)。
<Application x:Class="ImageManipulation.App"
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Startup="app_Startup" StartupUri="Window1.xaml">
<Application.Resources>
</Application.Resources>
</Application>
…
public partial class App : Application
{
/// <summary>
/// コマンドラインを処理するスタートアップ
/// </summary>
void app_Startup(object sender, StartupEventArgs e)
{
if (e.Args.Length == 0) return;
foreach (string argument in e.Args)
{
if (argument.Contains(".jpg") ||
argument.Contains(".JPG"))
{
VgaImageUC vga = new VgaImageUC(argument);
vga.Save();
}
else
{
MessageBox.Show("jpg以外の画像は処理できません、
jpgの画像をドラッグしてください",
"Not jpg file", MessageBoxButton.OK);
}
}
this.Shutdown();
}
}
追記:UserControlバージョンにコードを修正
マイクロソフト㈱エバンジェリスト。北海道大学理学部物理学科卒。リアルタイム3Dグラフィックスを専門とし、グラフィックスやシェーダに関する技術文章を執筆・講演。 DirectX SDK日本語ドキュメントの開発に携わるとともに、Windows Presentation Foundation プログラミング(オーム社)、Game Programming Gemsシリーズ、リアルタイム レンダリング第2版(ボーンデジタル)、Texturing & Modeling, A Procedural Approach などを翻訳・監修、XAMLプログラミング(ソフトバンク クリエイティブ)を執筆。趣味は薪割り。