7

私のアプリケーションの概要:クライアント側では、一連のスナップショットがWebカメラで取得されます。送信時に、画像をバイト配列に変換し、そのバイト配列を作成したサービスに送信する必要があります。

私の問題:単一の画像をに保存しようとしていますが、 「GDI+で一般的なエラーが発生しました」MemoryStreamというメッセージが表示されて壊れ続けます。深く掘り下げると、MemoryStreamのバッファ位置が54のときに例外がスローされることがわかります。残念ながら、これは写真です。コードのブロックは次のとおりです。1.2 mb

// Create array of MemoryStreams
var imageStreams = new MemoryStream[SelectedImages.Count];
for (int i = 0; i < this.SelectedImages.Count; i++)
{   
    System.Drawing.Image image = BitmapFromSource(this.SelectedImages[i]);
    imageStreams[i] = new MemoryStream();
    image.Save(imageStreams[i], ImageFormat.Bmp); /* Error is thrown here! */
}

// Combine MemoryStreams into a single byte array (Threw this 
// in in case somebody has a better approach)
byte[] bytes = new byte[imageStreams.Sum(s => s.Length)];
for(int i = 0; i < imageStreams.Length; i++)
{
    bytes.Concat(imageStreams[i].ToArray());
}

そしてこれが私のBitmapFromSourceメソッドです

// Converts a BitmapSource object to a Bitmap object
private System.Drawing.Image BitmapFromSource(BitmapSource source)
{
    System.Drawing.Image bitmap;

    using (MemoryStream ms = new MemoryStream())
    {
        BitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(source));
        encoder.Save(ms);
        bitmap = new System.Drawing.Bitmap(ms);
    }
    return bitmap;
}

Generic GDI + Errorについて読んだことの多くは、アクセス許可の問題を示していますが、ファイルシステムに保存していないことを考えると、ここでどのように適用されるかわかりません。また、このエラーは、画像を保存する前にMemoryStreamを閉じることで発生する可能性があることを確認しましたが、画像を保存する直前にMemoryStreamを作成したことを考えると、これがどのように適用されるかわかりません。任意の洞察をいただければ幸いです。

4

2 に答える 2

12

あなたの問題は実際にはBitmapFromSourceメソッドにあると思います。

ストリームを作成し、そのストリームからビットマップを作成し、ストリームを破棄して、ビットマップを別のストリームに保存しようとしています。ただし、Bitmapクラスのドキュメントには次のように記載されています。

ビットマップの存続期間中、ストリームを開いたままにしておく必要があります。

そのビットマップを保存するようになるまでに、元のストリームを破棄したため、ビットマップはすでに破損しています。

参照: http: //msdn.microsoft.com/en-us/library/z7ha67kw

これを修正するには(テストはもちろんのこと、コードを記述していないことを念頭に置いて)、コードの最初のブロックの最初のforループ内にMemoryStreamを作成し、そのメモリストリームを2番目のパラメーターとしてBitmapFromSourceメソッドに渡します。

于 2012-07-31T14:04:55.573 に答える
1

Graphics.DrawImageを呼び出すときは、セキュリティ例外を参照してください。これにより、ビットマップをASP.NETOutputStreamにレンダリングする際の一般的な問題が発生します。

于 2012-07-31T14:08:01.830 に答える