- - PR -
byte配列からのBitmap作成
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-24 17:07
こんにちは。
画像に手を加えるために、(SetPixelは非常に処理が遅いので)、byte配列を使用して処理を行っています。 処理が終わった画像を表示しているのですが、表示されているフォームをグリグリ動かし回ったりすると、AccessViolationExceptionが投げられます。 byte配列からビットマップを作成するために、Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr)のコンストラクタを使用しています。 IntPtrを取得するためにGCHandle.Alloc(obj, GCHandleType.Pinned)を使用しています。 やはりGCHandleを利用するのが怪しいのでしょうか。 このあたりの挙動がわからず困っています。 他にbyte配列からBitmapを作成する方法があればご教授いただきたいです。 なお、環境はXP Pro SP2 + VS2005(C#)です。 | ||||||||
|
投稿日時: 2006-08-24 17:45
まあ使わないに越したことは無いですね。その意味がわからないうちは特に。
Bitmap.LockBits Marshal.Copy 処理 Marshal.Copy Bitmap.UnlockBits と言う手順を踏むのが基本です。 unsafe、あるいは Marshal クラスのメンバを使えば Scan0 からバイト配列にコピーせず直接メモリを操作できます。 | ||||||||
|
投稿日時: 2006-08-24 22:02
おそらく、Paint イベント発生毎に「byte配列からビットマップを作成するために・・・」をされているのだと思うのですが、最初の1回だけ作って、それをクラスメンバに退避しておき、次回以降の Paint イベントでは、退避しておいたビットマップを用いればいいのではないですか? | ||||||||
|
投稿日時: 2006-08-25 05:50
今日は
Byte配列をMemoryStreamへ書き込み、ImageFromStreamでBitMapが作れると思います。 | ||||||||
|
投稿日時: 2006-08-25 18:24
ご返答ありがとうございます。
>Hongliangさん ライブラリの仕様上、Bitmapではなく初めからbyte配列となっているのでその方法は無理そうです・・・。 >Jittaさん 外部映像入力からbyte配列を生成しています。 byte配列から現在の方法でBitmapを作成するにはコンストラクタしかなく、中間処理をかます都合上、同じ配列とは限らないのでその方法も難しそうです。 >rvmxさん この方法が現実的そうのなですが、いろいろ見てみてもやり方がわかりません。 どのようにやればいいのでしょうか。 | ||||||||
|
投稿日時: 2006-08-25 18:45
いま、まさにFromStreamを使ってたところです。タイムリーだったのでびっくり。
Bitmap を作るには newImage を Bitmap のコンストラクタの引数にぶち込めばいいのかな | ||||||||
|
投稿日時: 2006-08-25 19:18
Bitmap (Int32, Int32, Int32, PixelFormat, IntPtr) を使うってことはヘッダが存在していないデータだろうから Image.FromStream/Bitmap(Stream) じゃ無理じゃないかなぁ……。
Bitmap (Int32, Int32, PixelFormat) を使って空の Bitmap を作成しておき、それを LockBits して Scan0 にコピーすれば行けそう? | ||||||||
|
投稿日時: 2006-08-28 09:01
下のでとりあえず表示できたんでいけそうな気がしますね。
|
1