DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DrawingContextでの画像表示

環境/言語:[Vista-SP1, WPF+C# .Net Framework3.5]
分類:[.NET]

お世話になります。
現在WPF+C#で開発しております。

別プロセスが取得した画像情報をByte*型の領域に取り込んで
画面上に表示しようとしています。
この画像情報というのはグレースケールのBitmap画像のヘッダを取り去ったデータだけの部分です。

現在ソースは以下のようになっているのですが
image = BitmapFrame.Create(ms);
部分で例外が発生してしまいます。
このような場合はどうすれば良いのかご教授いただけないでしょうか?
よろしくお願いします。

XAML側
        <Image x:Name="imgVideo" Stretch="Fill" Cursor="Cross">
            <Image.Source>
                <DrawingImage>
                    <DrawingImage.Drawing>
                        <DrawingGroup x:Name="drawingGroupVideo"/>
                    </DrawingImage.Drawing>
                </DrawingImage>
            </Image.Source>
        </Image>
C#側
    Byte* Buff; // 画像情報のポインタ
    int nSize;  // 画像情報のサイズ

    private void DrawVideo() {
        byte[] WkImage = new byte[nSize];
        Marshal.Copy(WkImage, 0, (IntPtr)Buff, WkImage.Length);
        MemoryStream ms = new MemoryStreamyWkImage);
        BitmapSource image = BitmapFrame.Create(ms);
        ms.Close();

        var image = CreateImage();
        if(image == null) {
            return;
        }
        var dc = drawingGroupVideo.Open();
        dc.DrawImage(image, new Rect(0, 0, 255, 255));
        :
        :
        dc.Close();
    }
BitmapFrame.Create(Stream) は、ファイル形式の画像データから BitmapFrame を作成する物です。
ピクセルデータから BitmapSource を生成するには、BitmapSource.Create(Int32, Int32, Double, Double, PixelFormat, BitmapPalette, IntPtr, Int32, Int32) などを使用して下さい。
■No26657に返信(Hongliangさんの記事)
> BitmapFrame.Create(Stream) は、ファイル形式の画像データから BitmapFrame を作成する物です。
> ピクセルデータから BitmapSource を生成するには、BitmapSource.Create(Int32, Int32, Double, Double, PixelFormat, BitmapPalette, IntPtr, Int32, Int32) などを使用して下さい。

早々の回答ありがとうございます。
ご指摘いただいたとおりに修正したのですが、
やはり例外が発生します。

C++で作成されたテストプログラムでは正しく表示されるので
データ自体に不備はないようです。
申し訳ありませんが今一度よろしくお願いします。

BitmapSource image = BitmapFrame.Create(255, 255,
                                        96, 96,
                                        PixelFormats.Gray8,
                                         BitmapPalettes.Gray256,
                                        (IntPtr)m_ImageBuffer,
                                        nSize,
                                        255);
■No26658に返信(pippiさんの記事)
> ■No26657に返信(Hongliangさんの記事)
>>BitmapFrame.Create(Stream) は、ファイル形式の画像データから BitmapFrame を作成する物です。
>>ピクセルデータから BitmapSource を生成するには、BitmapSource.Create(Int32, Int32, Double, Double, PixelFormat, BitmapPalette, IntPtr, Int32, Int32) などを使用して下さい。
>
> 早々の回答ありがとうございます。
> ご指摘いただいたとおりに修正したのですが、
> やはり例外が発生します。
>
> C++で作成されたテストプログラムでは正しく表示されるので
> データ自体に不備はないようです。
> 申し訳ありませんが今一度よろしくお願いします。
>
> BitmapSource image = BitmapFrame.Create(255, 255,
> 96, 96,
> PixelFormats.Gray8,
> BitmapPalettes.Gray256,
> (IntPtr)m_ImageBuffer,
> nSize,
> 255);

すみません!!
ビットマップのストライドの計算を間違えていました。
例では255ですが実際は計算しています。
調査してくださった皆様、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板