不況で倒産寸前のベンチャー企業(?)でプログラマー歴2年になった 新米プログラマーの日記のような雑記です。
welcome 猫並プログラマーの奮闘日記 !
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
category : スポンサー広告 

久々の更新です(・・;)


めちゃくちゃ忙しいんですよ~。

公私共にTODOが多すぎる・・・。

まぁオンラインゲームにインしなければ時間が空くわけなんですがw

独り身の寂しさでついつい入っちゃいますね(^-^;

ゲームも作りたいのに進まないわぁ。


WPFで画像を扱うときにハマったのでちょっとメモ


画像を扱うコントローラはImageクラスなんですが、
画像のピクセルをいじる場合はImageクラスからピクセル情報を
直接取得でない。

ピクセル情報を取得するには
BitmapImageクラスを使う。

BitmapImage bmp=new BitmapImage();

bmp.BeginInit();
bmp.UriSource=new Uri("hogehoge.bmp");
bmp.EndInit();

byte[] pixels=new byte[bmp.PixelWidth * bmp.PixelHeight * 4];

bmp.CopyPixels(pixels, bmp.PixelWidth * 4, 0); //コピー時BGRの順番

で注意なのはフォーマットがARGB32でデフォルトで読み込まれること。
RGB24に変換するときはColorConvertedBitmapクラスを使う。

ColorConvertedBitmap ccb=new ColorConvertedBitmap();

ccb.BeginInit();
ccb.Format=PixelFormats.Bgra24;
ccb.UriSource=bmp;
ccb.EndInit();


ここまで、すぐ調べてわかったけどハマったのはネットワーク経由で画像をメモリ上にもらって
それを表示するとき。

いろいろ調べた結果、これが一番最適な方法?なきがする

System.Windows.Media.Imaging.BitmapImage bmp = new BitmapImage();

using (System.IO.MemoryStream ms = new System.IO.MemoryStream(binarydata))
{

ms.Seek(0, System.IO.SeekOrigin.Begin); //<-これ重要

bmp.BeginInit();
bmp.CacheOption = BitmapCacheOption.OnLoad;//<-これ重要
bmp.StreamSource = ms;
bmp.EndInit();
}

ハマりポイントが2つあってひとつは "ms.Seek(0, System.IO.SeekOrigin.Begin);"
MemoryStreamはコンストラクタにバイナリ配列を指定するとPositionが終端にセットされるらしい。
なので、Positionを戻す必要がある。

もうひとつは"bmp.CacheOption = BitmapCacheOption.OnLoad;"これをセットしないとMemoryStreamをStreamSourceとして使えないので注意(例外が発生する)


結構、海外情報はたくさんあるんだけど国内での情報少ないなぁWPFは(^-^;

しかも、仕事の関係でOpenMPの勉強中でこっちも英語メインで大変です・・・。

ちゃんと英語勉強しとけばよかったな~。


スポンサーサイト
category : コンピュータ関係  comment : 0  track back : 1

thema:プログラミング - genre:コンピュータ


プロフィール

猫原

Author:猫原
猫でもわかる程度の能力な新米プログラマーです。

扱える言語:
アセンブラ(intel系,SH系),C/C++,C#,
java,PHP,etc...

趣味
アニメとかゲームとかプログラムとか
ようするにオタク
(特にガンダム大好きです)

最近のマイブームはニコ動でアイマス架空戦記見ること
(千早かわいいよ千早)

フリーエリア
検索フォーム
ブロとも申請フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。