1

ASP.NET バージョン 2 で C# を使用しています。画像ファイルを開き、XMP ヘッダーを読み取り (および変更)、再度閉じようとしています。ASP をアップグレードできないため、WIC は提供されていません。これを機能させる方法がわかりません。

これが私がこれまでに持っているものです:

Bitmap bmp = new Bitmap(Server.MapPath(imageFile));

MemoryStream ms = new MemoryStream();

StreamReader sr = new StreamReader(Server.MapPath(imageFile));

*[stuff with find and replace here]*

byte[] data = ToByteArray(sr.ReadToEnd());

ms = new MemoryStream(data);

originalImage = System.Drawing.Image.FromStream(ms);

助言がありますか?

4

3 に答える 3

1

こういうのはどうですか?

byte[] data = File.ReadAllBytes(path);
... find & replace bit here ...
File.WriteAllBytes(path, data);

また、メモリリークが発生し、時々クラッシュ/ランダムに失敗するため、asp.netプロセスでSystem.Bitmapを使用しないことを強くお勧めします(MSでさえこれを認めています)

System.Drawing.Bitmap が安定していない理由についての MS からの情報を次に示します。

http://msdn.microsoft.com/en-us/library/system.drawing.aspx

「注意: System.Drawing 名前空間内のクラスは、Windows または ASP.NET サービス内での使用はサポートされていません。これらのアプリケーション タイプのいずれかからこれらのクラスを使用しようとすると、サービスのパフォーマンスや実行時間の低下など、予期しない問題が発生する可能性があります。例外。」

于 2009-05-27T06:40:29.520 に答える
0

次の関数を使用して、バイナリ データを読み書きできます。

    public byte[] GetBinaryData(string path, int bufferSize)
    {
        MemoryStream ms = new MemoryStream();
        using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
        {
            int bytesRead;
            byte[] buffer = new byte[bufferSize];
            while((bytesRead = fs.Read(buffer,0,bufferSize))>0)
            {
                ms.Write(buffer,0,bytesRead);
            }
        }
        return(ms.ToArray());
    }

    public void SaveBinaryData(string path, byte[] data, int bufferSize)
    {
        using (FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write))
        {
            int totalBytesSaved = 0;
            while (totalBytesSaved<data.Length)
            {
                int remainingBytes = Math.Min(bufferSize, data.Length - totalBytesSaved);
                fs.Write(data, totalBytesSaved, remainingBytes);
                totalBytesSaved += remainingBytes;
            }
        }
    }

ただし、イメージ全体をメモリにロードすると、かなりの量の RAM が使用されます。XMP ヘッダーについてはよくわかりませんが、可能であれば次のことを行う必要があります。

  • ヘッダーのみをメモリにロードする
  • メモリ内のヘッダーを操作する
  • ヘッダーを新しいファイルに書き込みます
  • 元のファイルから残りのデータをコピーする
于 2009-05-26T22:20:10.470 に答える