2

バイトをイメージに変換し、WPF でイメージに表示する次の 2 つの関数があります。

 private JpegBitmapDecoder ConvertBytestoImageStream(byte[] imageData)
        {
            Stream imageStreamSource = new MemoryStream(imageData);            

            JpegBitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            BitmapSource bitmapSource = decoder.Frames[0];

            return decoder;
        }

上記のコードはまったく機能しません。「イメージング コンポーネントが見つかりません」という例外が常に発生します。画像が表示されません。

private MemoryStream ConvertBytestoImageStream(int CameraId, byte[] ImageData, int imgWidth, int imgHeight, DateTime detectTime)
    {  
        GCHandle gch = GCHandle.Alloc(ImageData, GCHandleType.Pinned);
        int stride = 4 * ((24 * imgWidth + 31) / 32);
        Bitmap bmp = new Bitmap(imgWidth, imgHeight, stride, PixelFormat.Format24bppRgb, gch.AddrOfPinnedObject());
        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, ImageFormat.Jpeg);
        gch.Free();

        return ms;
    }

この関数は機能しますが、非常に遅いです。コードを最適化したい。

4

1 に答える 1

5

JPEGConvertBytestoImageStreamバッファを渡せば問題なく動作します。ただし、改善できる点がいくつかあります。本当にデコーダーとビットマップのどちらを返したいかによって、メソッドは次のように記述できます。

private BitmapDecoder ConvertBytesToDecoder(byte[] buffer)
{
    using (MemoryStream stream = new MemoryStream(buffer))
    {
        return BitmapDecoder.Create(stream,
            BitmapCreateOptions.PreservePixelFormat,
            BitmapCacheOption.OnLoad); // enables closing the stream immediately
    }
}

またはこの方法:

private ImageSource ConvertBytesToImage(byte[] buffer)
{
    using (MemoryStream stream = new MemoryStream(buffer))
    {
        BitmapDecoder decoder = BitmapDecoder.Create(stream,
            BitmapCreateOptions.PreservePixelFormat,
            BitmapCacheOption.OnLoad); // enables closing the stream immediately
        return decoder.Frames[0];
    }
}

JpegBitmapDecoder を使用する代わりに、このコードは、提供されたデータ ストリームに対して適切なデコーダーを自動的に選択する抽象基本クラスBitmapDecoderの静的ファクトリ メソッドを利用することに注意してください。したがって、このコードは、WPF でサポートされているすべての画像形式に使用できます。

Stream オブジェクトは、不要になったときに破棄するusing ブロック内で使用されることにも注意してください。BitmapCacheOption.OnLoadは、ストリーム全体がデコーダーにロードされ、後で閉じることができるようにします。

于 2012-04-11T10:18:17.480 に答える