Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9364

ローカルファイルの画像をコンテキストメニューからMarkdownリンクに変換する

$
0
0

TyporaというMarkdownエディターに出会ってからドキュメントはmarkdownで書くようになりました。
Typoraではローカルの画像をエディタ上に貼り付けてそのまま表示することができます。

■こんな感じに↓
image.png

ローカルにある画像を![名前](画像リンク)で指定すればTyporaでは表示されます。
手順としては画像をTyporaにD&Dすることでいい感じに上のような表示になります。

ただ、Windowsのコンテキストメニューから画像を![名前](画像リンク)の形式にしてくれないかと考えました。
今回はコンテキストメニューへのリンク追加と、上のフォーマットに変換するプログラムを用意して実現します。

コンテキストメニューへの追加

そもそもコンテキストメニューってどんなやつかというのは下のやつです。
画像を右クリックしたときに出てくるメニューですね。ここはユーザーによって項目が異なります。
image.png

ここに項目を追加します。

レジストリエディタに設定追加

コンピュータ > HKEY_CLASSES_ROOT > * > shellを開く
image.png

キーの追加:ここは自由に名前をつける(今回はMarkdownリンク(&Q))
image.png

この時点でコンテキストメニューに上の内容が表示されるようになります。
image.png

キーの追加:command
image.png

項目の編集:"プログラム名(後述)のexeのパス" "%1"
image.png

とりあえずこの時点で一度レジストリの設定は終わりです。
次に変換用のプログラムの方を用意します。

Markdownリンク用の変換ツールの用意

ここは好きな言語で用意すれば良いと思いますが、サンプルとしてC#で今回作りました。
ポイントは、引数としてコンテキストメニューで押されたファイルのパスをmainメソッドのargs[]で受け取っているので
このファイルパスに対してゴニョゴニョして最終的にmarkdown形式の文字列としてクリップボードにコピーするイメージです。
C#ベースのコンソールアプリケーションですがウィンドウを表面に出したくないので、出力の種類は「Windows アプリケーション」にしています。
image.png

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.IO;usingSystem.Windows.Forms;usingSystem.Collections;usingSystem.Drawing.Imaging;namespacefilepathMarkdownConvert{classProgram{[STAThread]staticvoidMain(string[]args){stringmarkdownLink=System.String.Empty;try{stringsrcPath=args[0].ToString();stringfileName=Path.GetFileName(srcPath);stringformat=GetImageFormat(Path.GetExtension(srcPath));markdownLink=fileName+"]("+srcPath+")";// 画像形式とそれ以外でフォーマットを変えるmarkdownLink=(format!=null)?"!["+markdownLink:"["+markdownLink;Clipboard.SetDataObject(markdownLink,true);}catch{// not}}/// <summary>/// イメージのファイルフォーマットを拡張子から判断し取得する [C#]:humming bird http://yas-hummingbird.blogspot.com/2009/02/c_06.html/// </summary>/// <param name="ext"></param>/// <returns></returns>publicstaticstringGetImageFormat(stringext){foreach(ImageCodecInfoiciinImageCodecInfo.GetImageDecoders()){foreach(stringsinGetFileNameExtensions(ici)){if(s.ToUpper()==ext.ToUpper()){returnici.FormatDescription;}}}returnnull;}/// <summary>/// イメージのファイルフォーマットを拡張子から判断し取得する [C#]:humming bird http://yas-hummingbird.blogspot.com/2009/02/c_06.html/// </summary>/// <param name="ici"></param>/// <returns></returns>publicstaticIEnumerableGetFileNameExtensions(ImageCodecInfoici){foreach(stringsinici.FilenameExtension.Split(';')){yieldreturns.Substring(s.IndexOf('.'));}}}}

作成してビルドしたアプリケーションを任意の場所に配置してそのファイルパスをコピーしておきます
image.png

レジストリエディタの変換ツールのフルパスの部分にプログラムのパスを代入します
image.png

これで準備OKです

結果

34b58d1b6246270be536902682588eef.gif
わかりにくいですが、コンテキストメニューから追加したMarkdownリンクを選択すると
上で作成した変換ツールがバックグラウンドで起動してクリップボードに内容をコピーしています。

とりあえずこれでTyporaに画像をD&Dしなくても良くなりました。個人的には満足です。
※もしかしたらもっといい方法があるかもしれないです

コンテキストメニューに任意の項目を追加してアプリ実行ができるというのは収穫でした。

参考

右クリックメニューにアイテムを追加する - Windows 10
イメージのファイルフォーマットを拡張子から判断し取得する [C#]:humming bird


Viewing all articles
Browse latest Browse all 9364

Latest Images

Trending Articles