2012-06-03 2 views
0

나는 아래의 코드를 가지고, 나는 자르기와 동시에 크기를 조정하려고하는데, 나는 아래의 기능을 사용하여 150 x 150 픽셀의 이미지 크기가 가운데에 잘린 것을보고 있는데, 그러나 아래 함수는 항상 이미지의 폭은> 높이, 출력 이미지는 200x150 될 경우,하지만 난 그것을 150 × 150 픽셀,, 당신이 원하는이미지 크기 조정 및 업로드 asp, 그물 자르기에 자르기

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

ImageResizer API를 살펴 보시겠습니까? – IrishChieftain

답변

0

단계 달성하기 위해 어떤 도움이 될해야합니다

  1. 높이와 너비의 비율을 알아 내십시오
  2. 더 큰 치수를 입력하십시오 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); 
     } 

    } 
} 

하면 된대로 이전에 파일을 작성하는 계속합니다. 중요한 부분은 가운데에있는 네 개의 부동 소수점 값과 DrawImage 함수에서 RectangleF를 사용하여 분수 값에서도 중앙에 위치한다는 사실입니다. 과도한 앤티 앨리어싱으로 인해 동작을 원하지 않는다면 Math.Floor 값을 사용하고 계속 Rectangle 및 ints를 사용하십시오.

+0

원래 그림의 크기가 400x600이라고하면 위의 함수는 가운데를 자르고 크기를 정확히 150x150으로 변경합니까? – Moe9977

관련 문제