2012-03-20 12 views
1

は、私は、このコードは、C#で書かれている:ASP.NET(C#)アプリケーションで画像を最適化する方法は?

  int maxSideSize = 125; 
      MemoryStream memory = new MemoryStream(File.ReadAllBytes(Path.GetFullPath("test1.png"))); 
      Image img = Image.FromStream(memory); 

      //Determine image format 
      ImageFormat fmtImageFormat = img.RawFormat; 

      //get image original width and height 
      int intOldWidth = img.Width; 
      int intOldHeight = img.Height; 

      //determine if landscape or portrait 
      int intMaxSide; 
      if (intOldWidth >= intOldHeight) { 
       intMaxSide = intOldWidth; 
      } else { 
       intMaxSide = intOldHeight; 
      } 

      if (intMaxSide > maxSideSize) { 

       //set new width and height 
       double percent = maxSideSize/(double)intMaxSide; 
       intNewWidth = Convert.ToInt32(percent * intOldWidth); 
       intNewHeight = Convert.ToInt32(percent * intOldHeight); 
      } else { 
       intNewWidth = intOldWidth; 
       intNewHeight = intOldHeight; 
      } 

      //create new bitmap 
      Bitmap bmpResized = new Bitmap(img, intNewWidth, intNewHeight); 

      //save bitmap to disk 
      string path = Path.Combine("C:\\Temp", test1.png")); 

      bmpResized.Save(memory, fmtImageFormat); 
      img.Save(path); 

      //release used resources 
      img.Dispose(); 
      bmpResized.Dispose(); 
     } catch (Exception e) { 
      Console.Write(e.Message); 
     } 

は、上記のコード、ASP.NETアプリケーション用に最適化することはできますか?

1000人のユーザーが自分のサイトに接続していて、そのうち20%が125px(幅と高さ)を超える画像をアップロードすると、アプリケーションがクラッシュする可能性があります。

CanvasまたはDrawing2Dライブラリを使用することをお友達に勧めました。すでにファイルが存在する場合はどうなりますか?上書きすることは可能ですか?

愚かな質問を申し訳ありません。この場合はアドバイスが必要です。

+0

ユーザーの20%が同時に画像をアップロードしますか? – Stilgar

+0

と仮定します。私はシナリオを示しましたが、その割合はケースによって異なる可能性があります。 –

+0

アップロード/ビューの比率が1/4のシナリオは想像できません。 – Stilgar

答えて

1

20%のユーザーが同じ秒間に画像をアップロードすることはほとんどありません。もちろん、画像がアップロードされるときに画像のサイズを変更し、画像が配信されるときには変更しないようにする必要があります。あなたのサーバーがクラッシュしない作業を行うことはできないが、遅い応答時間につながるユーザーを待ち行列に入れてしまう場合、さらに何が起こるか。

匿名ユーザーに画像をアップロードさせる場合、あなたはDOS攻撃の対象となり、最適化されていないとそのことを防ぐことができないことに注意してください。アップロードが正当であるかどうかを積極的にチェックし、問題が発生した場合に新しいアップロードを絞り込むコードを追加する必要があります。

最後にコードが実際に記述されている場合は、ビットマップを作成するときにファイルから直接読み取ってビットマップを保存するときにファイルに直接保存できるメモリストリームはまったく必要ありません。ファイルアップロード中

あなたはをクリックしthis constructor overloadでファイルをロードし、ボタンをこのSave method overload

+0

匿名ユーザーはアップロードしません。私はフィルターと認証システムを持っていて、何人かの人がシステムをアップロードすることができます。上記のケースがシナリオです。 –

+1

パフォーマンスに問題はありますか?そうでない場合は、最適化の第1および第2のルールを考慮してください。 1.しないでください。 2(エキスパートユーザーのみ!)まだやめましょう! – Stilgar

+0

1つ。上記のコードでは、MemoryStreamを使用しています。画像をアップロードする人がいる場合、自動的に関数を呼び出してサイズを変更します。意味は、メモリを使用します。私のコードは最適化できますか? –

0

あなたはどのように使用する http://nuget.org/packages/Simple.ImageResizer

このnugetパッケージを使用することができます。私は古いたSystem.Drawingクラスよりも友好memorywiseことになっているWPFのクラスを利用した https://github.com/terjetyl/ImageResizer

+0

ああ、余分なパッケージが必要な場合はもちろん、ここに私の質問を載せるべきではありません。私は余分なパッケージではないいくつかのコードサンプルが必要です。私は必要ありません。とにかくあなたの努力のためにThx –

+0

あなたのアプリケーションのプロジェクトからコードをコピーしてください。この方法ではコードサンプルがあり、余分なパッケージはありません:) – Stilgar

+0

WPFはSystem.Drawingと同じ量のメモリを使用します。多分、ガベージコレクションのバグの多くは修正されていますが、新しいものが導入されました。また、WPFには、GDIの2パスバイキュービックサイズ変更がありません。これは、WPFのFantアルゴリズムよりもはるかに優れています。 –

0

でそれを保存することができます:

System.Drawing.Bitmap bmpPostedImage = new System.Drawing.Bitmap(File1.PostedFile.InputStream); 
    System.Drawing.Image objImage = ScaleImage(bmpPostedImage, 81); 
    objImage.Save(SaveLocation,ImageFormat.Png); 
    lblmsg.Text = "The file has been uploaded."; 

public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxHeight) 
     { 
      var ratio = (double)maxHeight/image.Height; 

      var newWidth = (int)(image.Width * ratio); 
      var newHeight = (int)(image.Height * ratio); 

      var newImage = new Bitmap(newWidth, newHeight); 
      using (var g = Graphics.FromImage(newImage)) 
      { 
       g.DrawImage(image, 0, 0, newWidth, newHeight); 
      } 
      return newImage; 
     } 

詳細をClick here

http://satindersinght.blogspot.in/2012/08/how-to-resize-image-while-uploading-in.html

関連する問題