- 作品名:
- 「ぱらグラフ」
- 作者名:
- はりまお
- 制作環境:
- Core i7-4770 3.40GHz + 8GB RAM
- Windows 10 Pro (64bit, 21H1)
- 開発言語:
- Visual Studio Community 2017
- Visual Basic 2017
- WPFアプリケーション
- 動作環境:
- .NET Framework 4.6.1
- 形態種別:
- フリーソフトウェア(ソース付き)
名前 | バージョン | 概容 |
---|---|---|
ParaGraph.exe | 1.3.1.1 | 実行ファイル |
Setting.xml | 設定ファイル | |
Readme.txt | 説明文(本文) | |
CreateNote.txt | 制作履歴 | |
GrpView | ソース フォルダ |
シンプルな画像ビューアです。
開いた画像と同じフォルダにある画像も一覧表示されるので、フォルダにたまった画像をパラパラ眺められます。
また、眺めるのに無用な機能は、極力排除しました。
本作は、『.NET Framework 4.6.1』を必要とします。【○参考・引用文献/拝借物】に挙げたサイトを参考に、導入しておいてください。
ダウンロードした圧縮ファイル"ParaGraph.zip"を、適当なフォルダに解凍してください。
インストールしたフォルダを丸ごと削除してください。
レジストリは、使用していません。インストールしたフォルダ以外の場所には、ファイルを生成していません。
実行ファイル"ParaGraph.exe"を、ダブルクリックすると起動します。
ウィンドウの右上にある
で終了します。終了時に、ウィンドウの位置や寸法、設定内容を保存します。対応している形式は、以下の通りです。アニメーションGIFも表示できますが、再生されません。
形式 | 拡張子 |
---|---|
Bitmap | *.bmp |
Gif | *.gif |
Icon | *.ico |
JPEG | *.jpg *.jpeg |
PNG | *.png |
TIFF | *.tif *.tiff |
画像を開くには、幾つかの方法があります。
ビュー上に並ぶ各種ボタンで、表示する画像を切り替えたり、全画面表示にしたりできます。
開いた画像と同じフォルダにある全ての画像が、サムネイル表示されます。
サムネイルの画像をクリックすると、ビューに表示される画像が切り替わります。
ボタンで設定欄を表示でき、背景の明るさを調節したり、画像の伸縮方法を切り替えたりできます。
実行ファイルのショートカットを作成して、それを“送る”メニューに登録すると、フォルダやファイルのコンテキストメニューから呼び出せて便利だと思います。
“送るメニュー”のフォルダは、エクスプローラのアドレス欄に"Shell:SendTo"
(小文字でも大文字でも可)と入力してEnterキーを押せば開きます。
機能 | ショートカット キー | |
---|---|---|
開く | Ctrl+O | |
前へ | Alt+← (←キー、 ボタンも可) |
|
次へ | Alt+→ (→キー、 ボタンも可) |
|
一覧表示切り替え | F4 | |
伸縮モード切替 | F10 | |
回転スライダ表示切替 | Alt+R | |
全画面 | F11 | |
UI表示切り替え | Alt+H | |
背景 | 黒 | F6 |
灰 | F7 | |
白 | F8 | |
倍率 | 1倍 | Alt+1 |
2倍 | Alt+2 | |
4倍 | Alt+4 | |
8倍 | Alt+8 | |
画像方向 | 上(0度) | Alt+W |
右(90度) | Alt+D | |
下(180度) | Alt+S | |
左(270度) | Alt+A | |
サムネイル高 | 小 | Alt+F6 |
中 | Alt+F7 | |
大 | Alt+F8 | |
広大化 | Ctrl+F12を数回押す | |
狭小化 | F12を数回押す |
ファイルの名前変更や削除を行いたい場合は、対象となる画像を選択してパスの右側にある
エクスプローラで行った変更は、ぱらグラフに反映されないのでご注意ください。
配布物にはソースも収録しているので、自分好みに改造してもらって結構です。もちろん、その気がないならソースフォルダを削除しても構いません。
ソースを使用する上での注意を一つ。
ソースフォルダに"obj"フォルダを含めていないため、Visual Studioでソリューション(プロジェクト)を開いた直後の状態では、ウィンドウのデザインを開けません。そこで、ソリューションを開いたら、とりあえずビルドしてください。"obj"フォルダが生成され、デザイナが使えるようになります。
本作は、画像ビューアから『作者が今までに使ったことがない機能を削ぎ落とす』コンセプトで創ったので、画像を加工したり、ファイルを操作したりといった、一般的に有りがちな機能を持っていません。
回転機能が、キーボードからしか呼び出せないのは、元々搭載するつもりがなかったからです。
ところが、本作でいろいろ見回っていると上下逆さまな写真に出くわしてしまったのです(フォトやペイントで開いている限りは自動的に回転されるので、ビューアに回転がある意味を全く理解していなかった)。「本当に回転は不要か?」との疑念とUIをスッキリしたい葛藤の結果、やっつけ仕事で済ますことにしました。
EXIFを読んで自動的に回転できれば理想的ですが、いかんせん技術が追いつかず実現できていません。
対応するフォーマットは、.NETで提供されているImageコントロールが扱えるものになります。世の中には、もっと多様なフォーマットが存在しますが、作者が扱うフォーマットは限られているので、これで十分なのです。
指示された画像ファイルが本作で読み込めるかどうかは、拡張子で判断しています。
たとえ対応しているフォーマットであっても、通常使用される拡張子から変更していると無視されます。また、拡張子は対応フォーマットのものでも、中身が異なる場合は、読み込みに失敗するのでスキップ(一覧から削除)されます。
ただ、プロジェクト内部に拡張子の定義ファイル(XML)を持っているので、拡張子の追加や、Imageコントロールの扱うフォーカットが拡張された際も、(ビルドを要しますが)比較的容易に対応できると思います。
本作の性格上、対象フォルダ内の全画像をメモリ上に展開します。これは、サムネイル一覧を表示するためと、ファイルをロックしない(エクスプローラで操作できるようにする)ためです。
であるが故に、画像数が多ければ多いほど、読み込みに相当な時間を要します。また、それに伴いメモリを大量に消費します。
“長々とロードを待った挙句にメモリ不足でこける”なんてことも無きにしも非ず。できることなら避けたい事態ですが、作者の技能では対処のしようがありません。ある程度ごとにフォルダを分けるなど、運用面での工夫が必要です。
読み込み処理に関して、「UIが硬直する」「時間がかかる」不満の解消を目論んで、非同期化と並列化を施しました。
とりあえず、非同期化(UIと重い処理を別のスレッドで走らせること)によって、読み込み中も操作可能になり、並列化(繰り返し処理の一つ一つを別々のスレッドに振り分けて同時に実行する)によって、条件次第では大幅な短縮に成功しました。
ただし、その恩恵には、幾つかの不都合と抱き合わせでした。
非同期化(PLINQ)は、読み込み中にアプリを終了しようとする際の障害になります。これは、読み込み用LINQのフィルタとして終了フラグを仕込んでおき、フラグが立ったら未読画像をスキップしてなるべく早くLINQを抜けるという、なんとも邪道な方法で隠蔽しました。
並列化は、確かに速いのですが、そこにはオーバーヘッドという厄介者が付きまといます。並列化によって削減できる時間が、並列化するために消費される時間を超えないと、逆効果になってしまいます。すなわち、読み込む画像が少ないと、並列でない場合に比べて、恐ろしく遅くなります(遅いと言っても、読み込み数が少ないですから、高が知れているとも言えますが…)。
また、LINQで一括処理している都合上、進捗状況をお知らせできない欠点があります。これは、タスクバーのアイコンを《Indeterminate》にする(クルクルさせる)だけでお茶を濁しておきました。
もっと真っ当なコードが書ければ、解決できる問題なのかもしれませんが、その知識を得ることができなかったので、難点には目を瞑って時間短縮を優先しました。果たして、どういう処理方法を採れば正道だったのか、実に悩ましい所です。
フォルダ単位で読み込むのに、ファイルを選択させるのは、単純にWPFにフォルダ選択ダイアログが無いからです。
サムネイルの表示順は、自然順ソート(エクスプローラの『名前順』に相当)しています。
自然順ソートを実現するために、簡単そうだった“StrCmpLogicalW”を使用しました。ただし、参考にしたサイトによると、ファイル名によっては永久ループに陥るそうです。なぜなのかは、分かりません。万が一の時は、設定ファイルを書き換えて自然順ソートを切ってください。書き換える項目は、下記の通りです。自然順ソートを使用しない場合は、ASCII順になります。
有効 | <NaturalSort>true</NaturalSort> |
---|---|
無効 | <NaturalSort>false</NaturalSort> |
画像ファイルとは、いつの間にやら溜まっているもの。知らぬ間に溜まったファイルの中身など、憶えちゃいないのが世の常。そうして忘れると中身を覗きたい衝動に駆られる悲しい性分。「あぁ〜、パラパラっとしたい!!」
もちろん、フリーの多機能なビューアの活用も模索した。この手のソフトは、多くが海外製で、しかもオーバースペック。無用な機能のUIは邪魔だし、なにより使い方のよくわからないままでは誤操作が恐ろしい。手に余っちゃいそう。
コリャもう自作でしょう!!
そりゃ役割としては、エクスプローラのサムネイルやWindows 10の標準アプリである『フォト』で事足りる。そうなんだけど、実の所、自作アプリなら『最近使用したファイル』に履歴が残らないんじゃないかって、淡い期待を抱いていたわけ。だって、「これ何だっけ?」って開いただけのファイルが、履歴に積み重なっていくのって気持ち良くないじゃない。ところが、この動作はエクスプローラが勝手にやっているようで、自作かどうかなんて無関係。やっぱりそうだったか(そもそも『最近使用したファイル』なんか使ってないんだから切ってしまえばいいのに…)。
改めて振り返ってみると、自作じゃなきゃダメな理由がなくなってきた感じ(ファイルの連番改名ソフトを仕掛りで放置していることもあって、“XnView”が最適な気がしてきた…トホホ)。そんなこと言ったって、WPFによる基本的な画像の取り扱いも試したかったんだからしょうがないじゃない。
高機能不要論を謳っておいてナンですが、制作の初期段階までは、もう少し高機能を志向していた。
例えば、ビューとサムネイル関連を別々のウィンドウにして、主画面いっぱいのビューと副画面いっぱいのサムネイルで広々したいなぁとか。期待に胸を膨らませて、実際にWウィンドウを試してみると…何だかモヤモヤする。一見快適そうだけど、もし単画面環境なら重ならないように綺麗に並べる必要があるし、本領発揮できるはずの多画面環境でも画面構成に合わせてウィンドウを振り分けて最大化する必要がある…これは実装面でも運用面でもゾッとするほど手間が掛かりそうだと。
他にも、2つの画像を並べて見比べようとか、サムネイルにチェックを付けて絞り込み・一括削除したりとかとか、色々妄想していたんだけど。どれもこれも使用頻度に対して開発コストが過大ではってことで、挫折し―元い―チョキッと切り捨てた。
WPF(XAML)開発を経験してWindowsフォームに戻ると、コントロールの配置が凄くまだるっこしい。XAMLの威力を痛感する瞬間。反面、UIの操作をXAMLで記述しようした途端に高難易度(;-;)。
「Visual Studio 2017導入を機にUWPも有り?」と、お気楽に調べ物。どれどれ…作ったアプリはストア経由でインストールしなきゃならん → ストアに登録は無料でしてやるけど開発者アカウント取ってね → 開発者アカウントが欲しけりゃ金払え…(T-T)。そんでもって、コマンドライン引数に代わるお手軽な連携方法も見当たらない、ソースの添付もできない(GitHub???)…ウ〜ム結局WPFに帰着するしかなかった。
でもまぁ、その代わりに“アイコンフォント”という収穫があったので、これを流用して(勝手に使って良いのかな? 標準フォントやし構わんよね?)お手軽にUIを作れちゃったから良しとしよう。そうそう、UIに貼ったアイコンは、あまたあるキャラクタの中から作者の感性のみに従って選んだ。そんなだから、各キャラクタが持っている本来の意図とは、かけ離れちゃっていると思う。あしからず。
毎度、有難う御座います。大変お世話になりました。