画像フォーマットのコンバータ

実行ファイルが置いてあるディレクトリ内のBMPファイルを
全てPNGファイルにコピーするPythonスクリプト
Python書くのは久しぶりなので、色々と雑なのは悪しからず。
ディレクトリの、日本語パスには対応していないっぽい(駄目だった)。

Python2.4使用。
それと The Python Imaging Library (PIL)を使用。
http://www.pythonware.com/products/pil/

# -*- coding: shift_jis -*-
import os, sys
import Image
import glob

extentionIn = "bmp"
extentionOut = "png"

def main():
     print ">>>",extentionIn,"形式のファイルを列挙."
     curdir = os.getcwd() # カレントディレクトリ名を取得
     files = glob.glob(unicode(curdir+ "/*." + extentionIn))

     #ファイルを列挙
     for file in files:
         print file
     print ">>>",extentionIn,"から",extentionOut,"へコンバート開始..."

     #ファイルをコンバート
     for file in files:
         im = Image.open(file)
         outfile = file.split('.')[0] + "." + extentionOut
         print outfile
         try:
             im.save(outfile)
         except IOError:
             print file + ":" "保存失敗"
     print ">>> コンバート終了."

main()
print "終了するにはEnterキーを押して下さいな."
raw_input()

Pixel-Snapとか

SnapsToDevicePixelsプロパティをTrueにすることで、アンチエイリアスを無効化。

Keyboard.Focus(UIElement)

キーボードのフォーカスを取得させる。ImageとかでもOK。

画像リソース埋め込みメモ。
ビルドアクションは"Resource"、出力ディレクトリに「コピーしない」でOK。

<UserControl.Resources>
     <BitmapImage x:Key="Icon_Edit" UriSource="/Icon/pencil.png" />
     <BitmapImage x:Key="Icon_ZoomIn" UriSource="/Icon/zoom_in.png" />
     <BitmapImage x:Key="Icon_ZoomOut" UriSource="/Icon/zoom_out.png" />
     <BitmapImage x:Key="Icon_ZoomReset" UriSource="/Icon/cabin.png" />
     <BitmapImage x:Key="Icon_SaveAsPic" 
UriSource="/Icon/save_labled_edit.png" />
</UserControl.Resources>

http://code.msdn.microsoft.com/windowsdesktop/CVBXAML-WPF-Windows-WPF-0738a600
WPFでの画像出力処理。

//PNGでの出力サンプル。Encoderは他にもBMP、JPEG、GIFなどが存在。
bitmap = ... //対象の画像。writeableBitmapクラスとか。
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
var dlg = new SaveFileDialog();
dlg.Filter = "PNG(*.png)|*.png";
if (dlg.ShowDialog() == true)
{
     FileStream stream = new FileStream(dlg.FileName, 
FileMode.Create,FileAccess.Write);
     encoder.Save(stream);
     stream.Close();
}

writeableBitmapの場合、全体をちゃんと更新してから保存すること。
※エディタ等で見えている部分だけ描画する方式をとっている時、
見えてない部分が初期化状態のままで真っ黒という罠を回避するため。

ClipToBoundsプロパティ

UIElementクラスのClipToBoundsプロパティをtrue*1 に設定すると、
コントロールの境界線上で子要素をクリッピング出来る。

お手製ScrollViewerの実装で、子要素をスクロールさせた時に、
UIの外側に子要素がはみ出ないように、ちゃんと設定しておくこと。

*1:デフォルトはfalse。デフォルトはtrueで良いような気がするが。。。

WPFのScrollBar

ScrollBarのThumb(つまみ/スライダー)の大きさの指定は、

scrollbar.ViewportSize

のプロパティを適切な値に指定してやればOK。
ぶっちゃけ「あの部分の名前なんだっけ」のために当該プロパティを延々探すハメに。。。

http://msdn.microsoft.com/ja-jp/library/system.windows.controls.primitives.track.thumb.aspx
詳細はこちらが詳しいので参照。
計算式自体は下記の通り。

ThumbSize = TrackLength * ViewportSize / (Maximum – Minimum + ViewportSize)

つまるところ、「表示範囲が含むスクロール値の量」を指定すれば良い。
例えば、10段階スクロールできて、表示範囲に7段階分表示されているなら、
7を指定すればスクロールバーの70%の大きさになる。

WPFでScrollbarを直接使用する頻度がどの程度あるかは知らないけども、
独自のScrollViewerの様な物を作る時に役に立つかも。
丁度そういう実装をしていたのでメモ。