2012-06-03 4 views
0

У меня есть код ниже, я ищу для обрезки и изменения размера в одно и то же время, я использую нижеследующую функцию, я ищу, чтобы иметь размер 150 x 150 пикселей, но ниже функция всегда, если ширина изображения> высота, выходное изображение будет 200x150, но мне нужно, чтобы это было 150x150 точек ,, любой помощиimage resize and crop при загрузке asp, net

Function SavetoDisk(FU As FileUpload, ByVal para_Save_to_Path As String, ByVal maxHeight As Integer, ByVal maxWidth As Integer, para_FileExt As String, anchor As AnchorPosition) 

    Using image As Image = image.FromStream(FU.PostedFile.InputStream) 

     Dim sourceWidth As Integer = image.Width 

     Dim sourceHeight As Integer = image.Height 
     Dim sourceX As Integer = 0 
     Dim sourceY As Integer = 0 
     Dim destX As Integer = 0 
     Dim destY As Integer = 0 

     Dim nPercent As Decimal = 0 
     Dim nPercentW As Decimal = 0 
     Dim nPercentH As Decimal = 0 

     nPercentW = (Convert.ToSingle(maxWidth)/Convert.ToSingle(sourceWidth)) 
     nPercentH = (Convert.ToSingle(maxHeight)/Convert.ToSingle(sourceHeight)) 

     If (nPercentH < nPercentW) Then 
      nPercent = nPercentW 
      Select Case (anchor) 
       Case AnchorPosition.Top 
        destY = 0 
       Case AnchorPosition.Bottom 
        destY = Convert.ToInt32(maxHeight - (sourceHeight * nPercent)) 
       Case Else 
        destY = Convert.ToInt32((maxHeight - (sourceHeight * nPercent))/2) 
      End Select 
     Else 
      nPercent = nPercentH 
      Select Case (anchor) 
       Case AnchorPosition.Left 
        destX = 0 
       Case AnchorPosition.Right 
        destX = Convert.ToInt32((maxWidth - (sourceWidth * nPercent))) 
       Case Else 
        destX = Convert.ToInt32(((maxWidth - (sourceWidth * nPercent))/2)) 
      End Select 
     End If 

     Dim destWidth As Integer = Convert.ToInt32((sourceWidth * nPercent)) 
     Dim destHeight As Integer = Convert.ToInt32((sourceHeight * nPercent)) 

     Using thumbnailBitmap As Bitmap = New Bitmap(destWidth, destHeight) 

      Using thumbnailGraph As Graphics = Graphics.FromImage(thumbnailBitmap) 

       thumbnailGraph.CompositingQuality = CompositingQuality.HighQuality 
       thumbnailGraph.SmoothingMode = SmoothingMode.HighQuality 
       thumbnailGraph.InterpolationMode = InterpolationMode.HighQualityBicubic 
       Dim imageRectangle As Rectangle = New Rectangle(0, 0, destHeight, destHeight) 
       thumbnailGraph.DrawImage(image, New Rectangle(destX, destY, destWidth, destHeight), New Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel) 

       Dim jpegCodec As ImageCodecInfo = Findcodecinfo("JPEG") 
       If Not IsNothing(jpegCodec) Then 
        Dim encoderParameters As EncoderParameters = New EncoderParameters(1) 
        encoderParameters.Param(0) = New EncoderParameter(Encoder.Quality, 80) 
        thumbnailBitmap.Save(para_Save_to_Path, jpegCodec, encoderParameters) 
       Else 
        thumbnailBitmap.Save(para_Save_to_Path, ImageFormat.Jpeg) 
       End If 
      End Using 

     End Using 

    End Using 

End Function 
+0

Посмотрите на API ImageResizer? – IrishChieftain

ответ

0

шагов, чтобы достичь того, чего вы хотите:

  1. Показатель соотношения высоты и ширины
  2. Масштабировать большую размерность dow от n до 150px и меньшего размера до отношения * 150px.
  3. Нарисуйте результат в середине растрового изображения 150x150.

Этот код будет делать именно то, что (C#):

using (Image img = Image.FromStream(FU.PostedFile.InputStream)) 
{ 
    int sourceWidth = img.Width; 
    int sourceHeight = img.Height; 

    int desiredHeight = 150; 
    int desiredWidth = 150; 

    double heightToWidthRatio = sourceHeight/(double)sourceWidth; 

    //This draw method will always center the image horizonally or vertically, as appropriate 
    using (Bitmap thumbnailBitmap = new Bitmap(desiredWidth, desiredHeight)) 
    { 
     using (Graphics thumbnailGraph = Graphics.FromImage(thumbnailBitmap)) 
     { 
      thumbnailGraph.CompositingQuality = CompositingQuality.HighQuality; 
      thumbnailGraph.SmoothingMode = SmoothingMode.HighQuality; 
      thumbnailGraph.InterpolationMode = InterpolationMode.HighQualityBicubic; 

      float destWidth = (heightToWidthRatio > 1f) ? (float)(desiredWidth/heightToWidthRatio) : desiredWidth; 
      float destHeight = (heightToWidthRatio > 1f) ? desiredHeight : (float)(desiredHeight * heightToWidthRatio); 
      float destX = (desiredWidth - destWidth)/2f; 
      float destY = (desiredHeight - destHeight)/2f; 

      thumbnailGraph.DrawImage(img, new RectangleF(destX, destY, destWidth, destHeight), 
               new Rectangle(sourceWidth, sourceHeight, sourceWidth, sourceHeight), 
               GraphicsUnit.Pixel); 
     } 

    } 
} 

Продолжить выписывать файл, как вы были ранее. Важной частью являются четыре значения поплавка в середине и тот факт, что он использует RectangleF в функции DrawImage, чтобы по-настоящему центрировать, даже по дробным значениям. Если вы не хотите этого поведения из-за чрезмерного сглаживания, просто Math.Floor значения и продолжайте использовать Rectangle и ints.

+0

позволяет сказать, что размеры исходного изображения 400 x 600, функция выше будет обрезать его в центре и изменить его размер точно 150 x 150 или что? – Moe9977