0

大きな jpeg をバイト配列として受け取るように Web リクエストを行います。これは、メモリ ストリームに変換できます。このデータを bitmapdata に取得して、再度バイト配列にマーシャリング コピーできるようにする必要があります。メモリ ストリームから返されたバイト配列が、bitmapdata のマーシャル コピーからバイト配列に返されたバイト配列と同じではないと仮定するのは正しいですか?

サイズが原因でメモリ不足エラーが返されるため、メモリ ストリームをイメージに書き出す必要はありません。また、コンパクトな cf C# 2 を使用しているという事実もあります。

これはサーバーへの私の呼び出しです..

HttpWebRequest _request = (HttpWebRequest)WebRequest.Create("A url/00249.jpg");
                _request.Method = "GET";
                _request.Timeout = 5000;
                _request.ReadWriteTimeout = 20000;
                byte[] _buffer;
                int _blockLength = 1024;
                int _bytesRead = 0;
                MemoryStream _ms = new MemoryStream();
                using (Stream _response = ((HttpWebResponse)_request.GetResponse()).GetResponseStream())
                {
                    do
                    {
                        _buffer = new byte[_blockLength];
                        _bytesRead = _response.Read(_buffer, 0, _blockLength);
                        _ms.Write(_buffer, 0, _bytesRead);
                    } while (_bytesRead > 0);
                }

これは、ビットマップデータからバイト配列を読み取るコードです。

 Bitmap Sprite = new Bitmap(_file);
        Bitmapdata RawOriginal = Sprite.LockBits(new Rectangle(0, 0, Sprite.Width, Sprite.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
        int origByteCount = RawOriginal.Stride * RawOriginal.Height;
        SpriteBytes = new Byte[origByteCount];
        System.Runtime.InteropServices.Marshal.Copy(RawOriginal.Scan0, SpriteBytes, 0, origByteCount);
        Sprite.UnlockBits(RawOriginal);

注:私はこれを使用したくありません:

Bitmap Sprite = new Bitmap(_file);

私は行きたい:

MemoryStream _ms = new MemoryStream();

System.Runtime.InteropServices.Marshal.Copy(RawOriginal.Scan0, SpriteBytes, 0, origByteCount);

ビットマップに書き込むことなく、必要な変換を使用します。

4

1 に答える 1

2

あなたが求めるものは難しいでしょう。応答オブジェクトから受け取るデータは完全な jpeg 画像であり、ヘッダーと一連の圧縮データ バイトがあります。によってアドレス指定されたバイト配列Scan0は圧縮されておらず、各スキャン ラインの最後にいくつかのパディング バイトが含まれている可能性があります。

Marshal.Copy最も重要なことは、受信したバイトを にコピーするために使用できないことScan0です。

あなたが求めていることを行うには、受け取った jpeg のヘッダーを解析し、画像ビットを に直接解凍し、Scan0必要に応じて各スキャンラインをパディングする必要があります。.NET Framework には、それを行うものは何もありません。

この質問に対する受け入れられた回答には、役立つライブラリへのリンクがあります。

それがうまくいったとしても、それがあなたを助けるかどうかはわかりません. イメージを作成するためにコンストラクターを呼び出すBitMapとメモリが不足する場合、このラウンドアバウト メソッドも同様にメモリ不足になることはほぼ確実です。

スプライトが多すぎてすべてをメモリに保持できないという問題は、非圧縮ですか? もしそうなら、あなたの問題を解決する別の方法を見つけなければならないでしょう。

ところで、画像を読み取るコードを次のように変更することで、多くの問題を回避できます。

    MemoryStream _ms = new MemoryStream();
    using (Stream _response = ((HttpWebResponse)_request.GetResponse()).GetResponseStream())
    {
        _response.CopyTo(_ms);
    }
于 2013-10-02T20:58:13.540 に答える