2008-08-26 21 views
20

ストーリー:ユーザーが写真ギャラリーに追加する画像をアップロードします。アップロードプロセスの一環として、A)画像をWebサーバーのハードドライブに保存し、B)画像のサムネイルをWebサーバーのハードドライブに保存する必要があります。ASP.NETを使用してサムネイルを作成する「最適な」方法とは何ですか?

「ベスト」ここパフォーマンスと高品質のサムネイルが二次的なもの、実装を理解し、かつ合理的な品質のサムネイルで

  • 結果
  • を維持することは比較的容易

    • として定義されます。

    答えて

    12

    .NETのImageクラスの​​を使用することをお勧めします。ここで

    // Example in C#, should be quite alike in ASP.NET 
    // Assuming filename as the uploaded file 
    using (Image bigImage = new Bitmap(filename)) 
    { 
        // Algorithm simplified for purpose of example. 
        int height = bigImage.Height/10; 
        int width = bigImage.Width/10; 
    
        // Now create a thumbnail 
        using (Image smallImage = image.GetThumbnailImage(width, 
                     height, 
                     new Image.GetThumbnailImageAbort(Abort), IntPtr.Zero)) 
        { 
         smallImage.Save("thumbnail.jpg", ImageFormat.Jpeg); 
        } 
    } 
    
    +5

    GetThumbnailImageは、60x60以下のサムネイルにのみ適しています。カメラによって生成されたサムネイルを使用します。また、あなたがそれらを知っていることを確認してください[他の29のエッジケース(http://nathanaeljones.com/163/20-image-resizing-pitfalls/)を処理する必要があります....ところで、 imageresizing.net](http://imageresizing.net)プロジェクトは現在、無料、オープンソース、サポートされています...そして、29の落とし穴を適切に処理します。 –

    3

    は、コードタグがvb.netコードが好きではありません申し訳ありませんがイメージクラスのVB.NETでの拡張メソッド

    Imports System.Runtime.CompilerServices 
    
    Namespace Extensions 
        ''' <summary> 
        ''' Extensions for the Image class. 
        ''' </summary> 
        ''' <remarks>Several usefull extensions for the image class.</remarks> 
        Public Module ImageExtensions 
    
         ''' <summary> 
         ''' Extends the image class so that it is easier to get a thumbnail from an image 
         ''' </summary> 
         ''' <param name="Input">Th image that is inputted, not really a parameter</param> 
         ''' <param name="MaximumSize">The maximumsize the thumbnail must be if keepaspectratio is set to true then the highest number of width or height is used and the other is calculated accordingly. </param> 
         ''' <param name="KeepAspectRatio">If set false width and height will be the same else the highest number of width or height is used and the other is calculated accordingly.</param> 
         ''' <returns>A thumbnail as image.</returns> 
         ''' <remarks> 
         ''' <example>Can be used as such. 
         ''' <code> 
         ''' Dim _NewImage as Image 
         ''' Dim _Graphics As Graphics 
         ''' _Image = New Bitmap(100, 100) 
         ''' _Graphics = Graphics.FromImage(_Image) 
         ''' _Graphics.FillRectangle(Brushes.Blue, New Rectangle(0, 0, 100, 100)) 
         ''' _Graphics.DrawLine(Pens.Black, 10, 0, 10, 100) 
         ''' Assert.IsNotNull(_Image) 
         ''' _NewImage = _Image.ToThumbnail(10) 
         ''' </code> 
         ''' </example> 
         ''' </remarks> 
         <Extension()> _ 
         Public Function ToThumbnail(ByVal Input As Image, ByVal MaximumSize As Integer, Optional ByVal KeepAspectRatio As Boolean = True) As Image 
         Dim ReturnImage As Image 
         Dim _Callback As Image.GetThumbnailImageAbort = Nothing 
         Dim _OriginalHeight As Double 
         Dim _OriginalWidth As Double 
         Dim _NewHeight As Double 
         Dim _NewWidth As Double 
         Dim _NormalImage As Image 
         Dim _Graphics As Graphics 
    
         _NormalImage = New Bitmap(Input.Width, Input.Height) 
         _Graphics = Graphics.FromImage(_NormalImage) 
         _Graphics.DrawImage(Input, 0, 0, Input.Width, Input.Height) 
         _OriginalHeight = _NormalImage.Height 
         _OriginalWidth = _NormalImage.Width 
         If KeepAspectRatio = True Then 
          If _OriginalHeight > _OriginalWidth Then 
           If _OriginalHeight > MaximumSize Then 
            _NewHeight = MaximumSize 
            _NewWidth = _OriginalWidth/_OriginalHeight * MaximumSize 
           Else 
            _NewHeight = _OriginalHeight 
            _NewWidth = _OriginalWidth 
           End If 
          Else 
           If _OriginalWidth > MaximumSize Then 
            _NewWidth = MaximumSize 
            _NewHeight = _OriginalHeight/_OriginalWidth * MaximumSize 
           Else 
            _NewHeight = _OriginalHeight 
            _NewWidth = _OriginalWidth 
           End If 
          End If 
         Else 
          _NewHeight = MaximumSize 
          _NewWidth = MaximumSize 
         End If 
         ReturnImage = _ 
          _NormalImage.GetThumbnailImage(Convert.ToInt32(_NewWidth), Convert.ToInt32(_NewHeight), _Callback, _ 
                IntPtr.Zero) 
         _NormalImage.Dispose() 
         _NormalImage = Nothing 
         _Graphics.Dispose() 
         _Graphics = Nothing 
         _Callback = Nothing 
         Return ReturnImage 
         End Function 
        End Module 
    End Namespace 
    

    です。

    +1

    "申し訳ありませんが、コードタグではvb.netコードが嫌いです。" =>私はそれを非難しない:P –

    0

    Image.GetThumbnailImage関数を使用すると、それを行うことができます。

    http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx(.NET 3.5)

    http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage(VS.80).aspxは(.NET 2.0)

    public bool ThumbnailCallback() 
    { 
        return false; 
    } 
    
    public void Example_GetThumb(PaintEventArgs e) 
    { 
        Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback); 
        Bitmap myBitmap = new Bitmap("Climber.jpg"); 
        Image myThumbnail = myBitmap.GetThumbnailImage(40, 40, myCallback, IntPtr.Zero); 
        e.Graphics.DrawImage(myThumbnail, 150, 75); 
    } 
    
    34

    GetThumbnailImageは動作しますが、あなたは少しより良い品質をしたい場合は、Bitmapクラスのためのあなたのイメージオプションを指定することができますし、ロードしたイメージをそこに保存します。ここではいくつかのサンプルコードは次のとおりです。 - それは可能な場合には、埋め込みJPEGのサムネイルを使用しようとするので、それは、非常に予測不可能な結果を​​提供します

    Image photo; // your uploaded image 
    
    Bitmap bmp = new Bitmap(resizeToWidth, resizeToHeight); 
    graphic = Graphics.FromImage(bmp); 
    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graphic.SmoothingMode = SmoothingMode.HighQuality; 
    graphic.PixelOffsetMode = PixelOffsetMode.HighQuality; 
    graphic.CompositingQuality = CompositingQuality.HighQuality; 
    graphic.DrawImage(photo, 0, 0, resizeToWidth, resizeToHeight); 
    imageToSave = bmp; 
    

    これはGetImageThumbnailボックス

    0

    のうち、GetThumbnailImageを回避するよりも、より良い品質を提供します - たとえ埋め込まれたサムネイル全体が間違ったサイズであっても。 DrawImage()はもっと良い解決策です。

    使用して、{}句であなたのビットマップをラップ - あなたの周りに浮い漏れたハンドルをしたくない...また

    、GDI +はそうどこにある90あなたのJPEG符号化品質を、設定したいと思います最高の輝き:ここでは、他の場所のカップルから、上記といくつかの例を使用して

    System.Drawing.Imaging.ImageCodecInfo[] info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); 
    System.Drawing.Imaging.EncoderParameters encoderParameters; 
    encoderParameters = new System.Drawing.Imaging.EncoderParameters(1); 
    encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L); 
    
    thumb.Save(ms, info[1], encoderParameters); 
    
    6

    ことだけ(ここではナタナエル・ジョーンズと他の人のおかげで)でドロップする簡単な機能です。

    using System.Drawing; 
    using System.Drawing.Drawing2D; 
    using System.IO; 
    
    public static void ResizeImage(string FileNameInput, string FileNameOutput, double ResizeHeight, double ResizeWidth, ImageFormat OutputFormat) 
    { 
        using (System.Drawing.Image photo = new Bitmap(FileNameInput)) 
        { 
         double aspectRatio = (double)photo.Width/photo.Height; 
         double boxRatio = ResizeWidth/ResizeHeight; 
         double scaleFactor = 0; 
    
         if (photo.Width < ResizeWidth && photo.Height < ResizeHeight) 
         { 
          // keep the image the same size since it is already smaller than our max width/height 
          scaleFactor = 1.0; 
         } 
         else 
         { 
          if (boxRatio > aspectRatio) 
           scaleFactor = ResizeHeight/photo.Height; 
          else 
           scaleFactor = ResizeWidth/photo.Width; 
         } 
    
         int newWidth = (int)(photo.Width * scaleFactor); 
         int newHeight = (int)(photo.Height * scaleFactor); 
    
         using (Bitmap bmp = new Bitmap(newWidth, newHeight)) 
         { 
          using (Graphics g = Graphics.FromImage(bmp)) 
          { 
           g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
           g.SmoothingMode = SmoothingMode.HighQuality; 
           g.CompositingQuality = CompositingQuality.HighQuality; 
           g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
    
           g.DrawImage(photo, 0, 0, newWidth, newHeight); 
    
           if (ImageFormat.Png.Equals(OutputFormat)) 
           { 
            bmp.Save(FileNameOutput, OutputFormat); 
           } 
           else if (ImageFormat.Jpeg.Equals(OutputFormat)) 
           { 
            ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders(); 
            EncoderParameters encoderParameters; 
            using (encoderParameters = new System.Drawing.Imaging.EncoderParameters(1)) 
            { 
             // use jpeg info[1] and set quality to 90 
             encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L); 
             bmp.Save(FileNameOutput, info[1], encoderParameters); 
            } 
           } 
          } 
         } 
        } 
    }