1

WritebleBitmap クラスを使用してキャンバスをビットマップに正常に追加し、ビットマップを使用して SaveFileDilogue を介してクライアント システムに画像を保存しようとしました。ラスター配列を使用して画像をピクセル単位で生成する FluxJpegCore 画像エンコードの方法を使用しています。以下は、仕事をするコードの一部です。

        byte[][,] raster = new byte[bands][,];

        for (int i = 0; i < bands; i++)
        {
            raster[i] = new byte[width, height];
        }

        for (int row = 0; row < height; row++)
        {
            for (int column = 0; column < width; column++)
            {
                int pixel = bitmap.Pixels[width * row + column];
                raster[0][column, row] = (byte)(pixel >> 16);
                raster[1][column, row] = (byte)(pixel >> 8);
                raster[2][column, row] = (byte)pixel;
            }
        }    

画像の保存はすべてうまくいきますが、画像をズームしてから印刷すると、「raster[i] = new byte[width, height];」という行でコードが失敗します。システムのメモリ不足エラーが発生します。これに関する解決策を見つけるのを手伝ってくれる人はいますか?

4

2 に答える 2

2

解決策があるかどうかはわかりません。3 つのアレイがあり、それぞれに連続した 163MB のメモリ ブロックが必要です。問題は、そのサイズのアドレス ブロックが 3 つプロセスにないことです。

また、 はbitmap.Pixels653MB の配列になることにも注意してください。

あなたの唯一の本当の希望は

  1. アプリ OOB を使用してください。うまくいけば、VM の断片化が制限され、非常に大きな配列を割り当てることができるようになります。
  2. FluxJpegCore がStreamバイト配列の代わりに使用でき、効率的に使用できる場合 (まだ多くの作業が必要です)
  3. Silverlight 5 に移行し、64 ビット ブラウザー インスタンスでアプリをホストします。
于 2012-01-30T12:59:50.057 に答える
0

@AnthonyWJonesを使用すると、幅または高さがdouble.NANのようなものであると確信しています。幅と高さが実数であることを確認するには、必ずチェックを入れてください。また、配列が Silverlight 内で可能な範囲を超えていないことを確認してください

于 2012-01-30T06:40:15.913 に答える