0

画像の送信方法に関する以前の質問で助けを得ました。行われたことは、最初に画像の長さ(サイズ)を送信し、次に実際の画像を送信することでした。その後、いつ完了したかがわかります。

IT は次のようになります。

BinaryWriter writer = new BinaryWriter(netStream);
while (someCondition) {
  Image img = SomeImage();
  MemoryStream ms = new MemoryStream();
  img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  byte[] buffer = new byte[ms.Length];
  ms.Seek(0, SeekOrigin.Begin);
  ms.Read(buffer, 0, buffer.Length);
  writer.Write(buffer.Length);
  writer.Write(buffer);

このコードは、前の質問で私を助けてくれた Angelo Geels からのものです。

さて、これをある意味で最適化しようとしました。そして、うまくいきます。ただし、ファイルが bmp (非圧縮) の場合のみで、その理由はわかりません。

                    using (MemoryStream ms = PrintWindow(process))
                    {
                        writer.Write((int)ms.Length);
                        writer.Write(ms.GetBuffer());
                    }

したがって、PrintWindow はイメージをメモリストリームに保存して返します。したがって、ms = 私のイメージを含むメモリストリーム。

だから私にとってこれは完璧に機能するはずです.

ファイルのサイズ (メモリストリームの長さ) を送信します。次に、メモリストリームで byte[] データを送信します。

だから、それは同じことです。

ただし、bmp でのみ機能します。

私が考えることができる唯一のことは、圧縮形式で保存すると、bmpが最初に書き込まれてからエンコードされ、getbuffer()または何かが台無しになるということです。

しかし、私はまだそれが機能するはずだと思います。

4

2 に答える 2

3

書き込むバイト数が多すぎる場合は、書き込む量を指定できる Write() オーバーロードを使用します。

    using (MemoryStream ms = PrintWindow(process)) {
        writer.Write((int)ms.Length);
        writer.Write(ms.GetBuffer(), 0, (int)ms.Length);
    }
于 2013-08-06T04:58:20.000 に答える
2

GetBuffer を使用しないでください。ドキュメントから:

バッファーには、未使用の可能性がある割り当てられたバイトが含まれていることに注意してください。たとえば、文字列 "test" が MemoryStream オブジェクトに書き込まれた場合、GetBuffer から返されるバッファーの長さは 4 ではなく 256 で、252 バイトが未使用です。バッファー内のデータのみを取得するには、ToArray メソッドを使用します。ただし、ToArray はメモリ内にデータのコピーを作成します。

使用する:

 writer.Write(ms.ToArray());

または、4.0 を使用している場合は、CopyTo メソッドを使用します。

 ms.CopyTo(netStream);

ストリームをコピーする方法について 4.0 を使用していない場合は、これを確認してください: あるストリームのコンテンツを別のストリームにコピーするにはどうすればよいですか?

于 2013-08-06T04:25:47.277 に答える