0

ファイル転送プログラムがあります。プログラム (クライアント) は、TCP ソケット経由でビットマップを送信するために次の操作を実行します: スクリーンショットを取得 ->メモリからビットマップを取得-> ストリームに変換 -> 送信

        MemoryStream Fs = new MemoryStream();

//////////////11111
        Bitmap bmp = TakeScreen();

///////////////2222
        //Bitmap bmp = new Bitmap(@"C:\temp\001.bmp");


        bmp.Save(Fs, ImageFormat.Bmp);
        Byte[] buffer = Fs.ToArray();

        Fs.Read(buffer, 0, buffer.Length);
        TcpClient socket = new TcpClient("192.168.0.131", 1095);

        NetworkStream nw = socket.GetStream();
        nw.Write(buffer, 0, buffer.Length);
        nw.Close();
        Fs.Dispose();
        socket.Close();
        bmp.Dispose();
  • メモリから直接画像を転送することを選択した場合-エラーはありません。

  • 最初にファイルからビットマップをロードしようとすると、サーバー側で「パラメーターが無効です」というエラーが表示されます。

サーバー側は次のとおりです。

                    NetworkStream Nw = new NetworkStream(handlerSocket.Client);
                    int thisRead = 0;
                    int Blocksize = 1024;
                    Byte[] dataByte = new Byte[Blocksize];

                    Bitmap screen = getScreen(Nw, dataByte, thisRead, Blocksize);
                    Nw.Close();

   private Bitmap getScreen(NetworkStream Nw, Byte[] dataByte, int thisRead, int Blocksize)
    {
        Bitmap bitmap;
        using (var strm = new MemoryStream())
        {

            while (true)
            {
                thisRead = Nw.Read(dataByte, 0, Blocksize);
                strm.Write(dataByte, 0, thisRead);
                if (thisRead == 0)
                    break;
            }

            bitmap = new Bitmap(strm); // Error here
        }
        Bitmap bm3 = new Bitmap(bitmap);
        bitmap.Dispose();
        return bm3;
    }

このエラーの原因は何ですか? 私はそれがMemoryStreamと関係があると思います。

編集:質問を簡素化

4

1 に答える 1

1

Bitmapinを作成する前に、ストリームの先頭までシークする必要がありますgetScreen

private Bitmap getScreen(NetworkStream Nw, Byte[] dataByte, int thisRead, int Blocksize)
{
    Bitmap bitmap;
    using (var strm = new MemoryStream())
    {
        while (true)
        {
            thisRead = Nw.Read(dataByte, 0, Blocksize);
            strm.Write(dataByte, 0, thisRead);
            if (thisRead == 0)
               break;
        }

        stream.Seek(0, SeekOrigin.Begin; // <-- Go Back to beginning of stream
        bitmap = new Bitmap(strm); // Error here
    }
    Bitmap bm3 = new Bitmap(bitmap);
    bitmap.Dispose();
    return bm3;
}

EDIT
詳細な説明: ストリームに最後のバイトを書き込んだ後、ストリームの現在の位置はストリームの末尾になります。画面からを作成するBitmapと、ストリームからビットマップを読み込もうとしますが、現在の位置 (= ストリームの終わり) の後にデータがないため、機能しません。

したがって、現在の位置をストリームの先頭に戻すようにストリームに指示する必要があります。その後、ビットマップ情報を読み取ることができます。

于 2012-04-04T09:59:47.047 に答える