2012-09-01 2 views
0

MVC3 앱을 통해 업로드 된 이미지의 크기를 조정하려고합니다. 아래 코드는 지정된 매개 변수를 기반으로하는 타겟 크기를 기준으로 이미지의 크기를 조정할 수 있지만 최종 결과는 거친 이미지입니다. 나는 stackoverflow와 msn 샘플에서 많은 다른 솔루션을 시도했지만 모든 것이 거친 이미지를 반환한다.이미지 크기 조정으로 인해 C#에서 거친 출력이 발생합니다.

static public Image ResizeFile(HttpPostedFileBase file, int targeWidth, int targetHeight) 
    { 
     Image originalImage = null; 
     bool IsImage = true; 
     Bitmap bitmap = null; 

     try 
     { 
      originalImage = Image.FromStream(file.InputStream, true, true); 
     } 
     catch 
     { 
      IsImage = false; 
     } 

     if (IsImage) 
     { 
      //accept an image only if it is less than 3mb(max) 
      if (file.ContentLength <= 3145728) 
      { 
       var newImage = new MemoryStream(); 
       Rectangle origRect = new Rectangle(0, 0, originalImage.Width, originalImage.Height); 

       // if targets are null, require scale. for specified sized images eg. Event Image, or Profile photos. 
       int newWidth = 0; 
       int newHeight = 0; 

       //if the width is greater than height 
       if (originalImage.Width > originalImage.Height) 
       { 
        newWidth = targeWidth; 
        newHeight = targetHeight; 
        bitmap = new Bitmap(newWidth, newHeight); 
       } 

       //if the size of image is larger than either one of the target size 
       else if (originalImage.Width > targeWidth || originalImage.Height > targetHeight) 
       { 
        newWidth = targeWidth; 
        newHeight = targetHeight; 
        bitmap = new Bitmap(newWidth, newHeight); 
       } 
       //reuse old dimensions 
       else 
       { 
        bitmap = new Bitmap(originalImage.Width, originalImage.Height); 
       } 

       try 
       { 
        using (Graphics g = Graphics.FromImage((Image)bitmap)) 
        { 
         g.SmoothingMode = SmoothingMode.AntiAlias; 
         g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
         g.CompositingQuality = CompositingQuality.HighQuality; 
         g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
         g.DrawImage(originalImage, new Rectangle(0, 0, newWidth, newHeight), 
          0, 
          0,   // upper-left corner of source rectangle 
          originalImage.Width,  // width of source rectangle 
          originalImage.Height,  // height of source rectangle 
          GraphicsUnit.Pixel); 
         bitmap.Save(newImage, ImageFormat.Jpeg); 
        } 
       } 
       catch (Exception ex) 
       { // error before IDisposable ownership transfer 
        if (bitmap != null) 
         bitmap.Dispose(); 

        logger.Info("Domain/Utilities/ImageResizer->ResizeFile: " + ex.ToString()); 

        throw new Exception("Error resizing file."); 
       } 
      }     
     } 

     return (Image)bitmap; 
    } 

UPDATE 1 개 제거 매개 변수와 인코더는, 현재의 .jpeg로 저장. 그러나 여전히 거친 이미지를 생성합니다.

답변

0

제안의 몇

1) 이미지를 확대하지 있는지 확인하십시오.

2) 위의 제외하고 다른 모든 옵션 설정을 제거하고 간단하게 사용하여 파일을 저장할 것 대신 HighQuality

위를 실패의 g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias을 시도;

bitmap.Save(newImage, Imaging.ImageFormat.Jpeg); 

나는 위의 모든 것이 완벽하게 작동한다는 것을 알게되었다.

+0

1) 아니요, 실제로 매개 변수를 전달하여 100x100px 또는 27x27px로 축소합니다. 원래 형식으로 저장된 이미지가 필요합니다. * .png, * .gif 등 –

+1

코드에서 수행하는 작업이 아닙니다. imageEncoders [1] jpeg –

+0

위 코드를 업데이트하여 인코더 등을 제거하고 .jpeg로 저장하려고했습니다. 그러나 여전히 거친 이미지를 생성합니다. –

관련 문제