System.Drawing.BitmapをWPF用に変換

.NETで画像リソースやOpenCVLink の.NETラッパーEmguLink から画像データを得ようとするとSystem.Drawing.Bitmapインスタンスになるのですが、WPFで直接読み込む方法がないようです。というわけで変換になるのですが、これがちと曲者っぽいので備忘録。

Stream経由

コードが短くて済むのは一旦StreamにBMP形式(昨今メモリは潤沢にあるのでPNG等圧縮する必要はないかと)で保存、それを読みこませる方法。

using System.Windows.Controls;
using System.Drawing;
using System.IO;
(省略)
Bitmap bmp = (何か);
using (Stream st = new MemoryStream())
{
    bmp.Save(st, ImageFormat.Bmp);
    st.Seek(0, SeekOrigin.Begin);
    image1.Source = BitmapFrame.Create(st, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}

この方法が曲者なのはBitmapFrame.CreateがStream読み込みを同期でするのか非同期なのかよく分からない所。非同期で上のコードだと読み込み完了前にStreamが破棄される可能性が高いので失敗(例外は出ず画像が表示されない)。とは言え読み込み終わってもStreamは自動的には閉じられないようなので、放おっておくとガベージコレクション任せということでしょうか。

ネット上の画像を同期読み込みするとBitmapFrame.Createで処理がブロックされるため非同期にするのでしょうけど、同期と非同期の切替条件が今ひとつはっきりしない。私の環境(Windows7 x64、Visual C# 2010 Express、.NET Framework 4 Client Profile)だとFileStreamとMemoryStreamは同期、WebResponseから得るStreamは非同期になるようでしたが、環境や将来的に変わるかもしれない。

非同期になると読み込み中はBitmapFrameインスタンスのIsDownloadingがtrueになり、完了時にDownloadCompletedイベントが飛ぶ(同期だと飛ばない)みたいなのでプロパティをチェックしてイベントハンドラでStreamを閉じるという方法もありますが、イベントハンドラをセットする前に読み込みが完了する可能性がゼロではないため、ちと不安。まぁCreateの直後にやればまず大丈夫でしょうけど。

HBitmap経由

Unmanagedに抵抗がなければ、こちらの方がある意味悩まなくて済むかと。

using System.Windows.Controls;
using System.Drawing;
using System.IO;
(省略)
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
(省略)
Bitmap bmp = (何か);
IntPtr hBitmap = bmp.GetHbitmap();
try
{
    image1.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
        hBitmap,
        IntPtr.Zero,
        Int32Rect.Empty,
        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
finally
{
    DeleteObject(hBitmap);
}

LateBoundBitmapDecoderLink なんてもの別途用意しているんだから、自動で同期・非同期を切り替えるのはやらなくていいと思う、個人的には。

[参考]

— posted by mu at 01:05 pm   commentComment [2]  pingTrackBack [0]

家電エコポイントで腕時計

blog20120325-CitizenRegunoE031

壊れた冷蔵庫Link を買い換えた時に得た家電エコポイントの交換期限が迫っていたので、何と交換しようかと交換品リストを眺める。

これに限らずクレジットカードなどのポイント交換も送料や手数料を差し引いた額が現物に当てられるため、ポイントの少ない品物を選ぶと全体に占める手数料・送料の割合が大きくなります。そのため現物を見てそのしょぼさにがっかりすることが多く、私は一点豪華主義で選んでます。基本的には商品券やプリペイドカードに交換するのがお得ですが、エコポイントと銘打っている手前上交換商品は何かしらのエコロジーを標榜した物か地域特産品。今回の持ちポイントは11000点ということで、10000点使ってソーラー腕時計を。

で、今日到着。シチズン レグノ RL26-2082C WPLink …レディースだった _| ̄|○

メタルベルトは夏場に汗が溜まって痒くなるので革ベルトを選んだのが仇に。デザインは文句ないのですが私の腕の太さには、ちと小さいな。男がレディース腕時計着けても別段問題無いようなのでLink 開き直って使う予定。

— posted by mu at 08:59 pm   commentComment [0]  pingTrackBack [0]

欠けた歯の治療が完了

blog20120318-ToothModel

欠けた歯Link の治療5日目。先週設置した金属の台座の上に被せ物の歯(クラウン)を取り付けてようやく完了。銀歯でも良かったのだけど、一応口を開けると見える歯だったので硬質樹脂製に。年月が経つと変色の可能性があるらしいけど、まぁ普段見えないし(どっちだよ…)

クラウンを製作するために取った歯形の模型を見せられた後、持ち帰るかと聞かれました。以前レントゲン写真をくれなんて言ったLink けどさ、普通患者にそんな提案する? もちろん貰ったけど(笑)

こうやって見ると奥歯の歯並びが良くない。右が上顎で今回割れた歯には金属の土台。左が下顎。分かりにくいので左上に拡大を入れてみたのですが、左右ともに親知らずが横向き、奥から前に生えております。食べ物がよく詰まるとは思ってたけど、こんなふうになっていたのかと納得。

んで、この横向いた親知らずは抜いたほうが良いということらしい。町医者じゃできないってことで、別の医院に通うことになりそうです。抜くと痛いってよく聞くし、憂鬱だ…

— posted by mu at 10:07 pm   commentComment [0]  pingTrackBack [0]

Windows8 x64 CP

blog20120304-Windows8CP

以前Dell Vostro1500に入れたWindows7 RCLink に上書きする形で、インストール。この記事もWindows8から書き込み。

インストールはISOファイルをタウンロードしてDVDから起動。最初数分間画面の真ん中にポリゴン金魚が表示されるだけの状態が続き、ハングアップしたのかと不安に。Vistaあたりから起動時に情報を表示しなくなってきてるのですが、さらに拍車がかかった感じ。20年くらい前のMacは通常使用でもとにかくシステム情報を見せてくれなくて、不具合などを隠蔽し続けた末いきなりSad Macとか爆弾アイコンを出して止まるのが大嫌いだったのですが、Windowsもそっちに行ってしまってますね。大多数のユーザーにはシステム情報をテキストでバラバラっと表示しても不安を煽るだけなのでしょうけど。

噂程度には内容を聞いていてはいたものの、Metro UIを使うのは初めて。各アプリケーションは基本全画面を使用という思想はDOSに先祖返りしたように思え、やっぱりデスクトップPCの持つ広大なデスクトップにはもったいない使い方。私は起動後速攻でデスクトップを表示し、右下隅に表示したテレビをながら見しつつネトゲやブラウザを起動する従来の使い方に収まりそう。あとMetro UIでもたらされた新機能がクラウドとかSNSとか私が普段使用しない機能ってのも、「Windows8、別にいらないなぁ」と思う理由になるかと。

— posted by mu at 11:05 pm   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0150 sec.
prev
2012.3
next
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31