改善我的图像调整大小功能以获得更好的质量图像...减少循环?

时间:2012-09-16 21:45:54

标签: asp.net image-processing graphics bitmap image-resizing

前段时间我正在尝试为我网站的后端创建一个图片上传工具。我设法实现了这一目标,但是在较小的图像上我的图像质量仍然很差。

我需要创建4张图片:

  1. 放大图片1800 x 1800 px max
  2. 显示图片180 x 275px max
  3. 搜索图片120 x 100px max
  4. 微小缩略图50 x 50px max
  5. 我通常在上传之前手动调整大小并用Photoshop或其他东西成像到1800 x 1800,然后使用下面的代码上传和调整大小(图像都是jpgs)

    变量是:

    1. FileName =最初上传正常
    2. NewFileName =将调整大小后的图像另存为
    3. 的文件名
    4. maxWidth / maxHeight - 自我解释
    5. uploadDir =要保存到的目录
    6. 分辨率=质量jpg分辨率0-100,我在这些例子中使用80

       Public Shared Sub ResizeImages(FileName, NewFileName, maxWidth, maxHeight, uploadDir, resolution)
       Try
          Dim originalImg As System.Drawing.Image = System.Drawing.Image.FromFile(uploadDir & FileName)
          Dim aspectRatio As Double
          Dim newHeight As Integer
          Dim newWidth As Integer
         ' Calculate Size '
              If originalImg.Width > maxWidth Or originalImg.Height > maxHeight Then
                  If originalImg.Width >= originalImg.Height Then ' image is wider than tall
                      newWidth = maxWidth
                      aspectRatio = originalImg.Width / maxWidth
                      newHeight = originalImg.Height / aspectRatio
                  Else ' image is taller than wide
                      newHeight = maxHeight
                      aspectRatio = originalImg.Height / maxHeight
                      newWidth = originalImg.Width / aspectRatio
                  End If
              Else ' if image is not larger than max then keep original size
                  newWidth = originalImg.Width
                  newHeight = originalImg.Height
              End If
      
              Dim newImg As New Bitmap(originalImg, CInt(newWidth), CInt(newHeight)) '' blank canvas
              Dim canvas As Graphics = Graphics.FromImage(newImg) 'graphics element
      
              '*** compress ***'
              Dim myEncoderParameters As EncoderParameters
              myEncoderParameters = New EncoderParameters(1)
              ' set quality level based on "resolution" variable
              Dim myEncoderParameter = New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, CType(resolution, Int32))
              myEncoderParameters.Param(0) = myEncoderParameter
      
              canvas.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
              canvas.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
              canvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
      
              canvas.DrawImage(newImg, New Rectangle(0, 0, newWidth, newHeight))
              newImg.Save(uploadDir & (NewFileName), getCodec("image/jpeg"), myEncoderParameters)
      
              '*** Close ***'
              canvas.Dispose()
              originalImg.Dispose()
              newImg.Dispose()
              '*** Nothing ***'
              canvas = Nothing
              newImg = Nothing
              originalImg = Nothing
      
          Catch ex As Exception
              HttpContext.Current.Response.Write(ex.ToString & " " & uploadDir & " " & FileName & " _ " & NewFileName)
          End Try
      
      End Sub
      
    7. 要实现所有四个图像,我将所需的大小作为列表传递,然后按照预期文件大小的降序循环该列表,因此,首先是最大的一个,然后我将最近上传的图像传递给函数作为FileName参数,这样每次,函数都会收到一个较小的图像,所以不要试图将2000x2000px图像的大小调整为50x50px,因为我从阅读各种帖子中意识到,这种大幅减少会导致质量不佳。 / p>

      在这种方法中运行循环,我的小缩略图质量非常好,但我的中间图像仍然很差。

      这里它们按大小顺序递减:

      http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580.jpg http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580-dis.jpg http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580-se.jpg http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580-tb.jpg

      正如您所看到的,“搜索”和“显示”图像在吉他边缘仍然是块状的。

      我做错了什么?!

      如果我的减少很多,我将如何进行内存逐渐减少。

      我的意思是,令我感到震惊的是,上面的函数每次都将文件保存到光盘,这必须花费一些时间,所以如果我要循环缩小功能,减小图像的大小,在内存中以小增量(例如每次10%),然后在缩小达到正确大小时将最终图像保存到光盘。我不知道怎么做。

      我正在使用ASP.NET 2.0并且它相对较新,所以我并不完全了解可用的所有方法。

      任何代码示例都会有很大帮助!

      由于

1 个答案:

答案 0 :(得分:1)

你做错了是你使用Bitmap构造函数创建缩小尺寸的图像,然后将该图像绘制到自身上。 Bitmap构造函数自然不能使用您稍后在Graphics对象中设置的质量设置来调整图像大小,因此质量会很差。

相反,您应该使用仅采用大小的构造函数创建一个空白Bitmap对象:

Dim newImg As New Bitmap(newWidth, newHeight)

然后你应该在画布上绘制原始图像:

canvas.DrawImage(originalImg, New Rectangle(0, 0, newWidth, newHeight))