3

ASP.NETMVC3での画像アップロードのシナリオがあります。

  • コントローラ

    public ActionResult Upload(IEnumerable<HttpPostedFileBase> images, SomeViewModel model)
    {
      foreach(var i in images)
      {
        ...
    
        byte[] fileBytes = i.InputStream.GetBytesArray();
    
        byte[] image = _imageManager.Resize(fileBytes, MaxImageWidth, MaxImageHeight, true); 
    
        ...
      }
    }
    
  • ImageManager

    public byte[] Resize(byte[] content, int width, int height, bool preserveAR = true)
    {
      if (content == null)
        return null;
    
      WebImage wi = new WebImage(content);
    
      wi = wi.Resize(width, height, preserveAspectRatio);
    
      return wi.GetBytes();
    }
    

そのため、クライアントからHttpPostedFileBaseとして画像を受け取ります。byte[]fileBytesをimageManagerのResizeメソッドに渡します。画像マネージャは新しいWebImageインスタンスを作成してから、画像のサイズを変更して、もう一度byte[]に変換します。

このコードをデバッグするとき、wi.GetBytes()行を渡すと、メモリ使用量が大幅に増加します(少なくとも500MB)。10MBの画像をアップロードしています。小さいサイズの写真(〜1.5mb)をアップロードする場合、メモリ消費は正常です。

これの原因は何である可能性があり、これは何らかの方法で修正できますか?

ありがとうございました

4

1 に答える 1

1

内部的には、WebImageはSystem.Drawing.Image.FromStream元の画像ストリームを取得し、それをバイトの配列に変換するために使用します。6.0MBのJPGを取得してそのメソッドを呼び出してみたところ、6.0MBのストリームが得られました。BMPを要求すると、172MBのバイトが表示されます

圧縮された画像(PNG / JPGなど)をアップロードしていて、GetBytesを呼び出すと、画像の解凍されたバイトが使用可能になっていると思われます。生の形に解凍すると、画像が実際にはかなり大きくなる可能性があります。Streamオブジェクトを完全に処理するというこの不足を回避するためにできることはあまりないので、一度にすべてをメモリにロードすることはありません。

于 2012-07-06T23:10:11.767 に答える