2013-01-23 2 views
0

jpeg 이미지를 업로드하고 데이터베이스에 바이트 배열로 저장하고 있습니다. 그러나 내가 이미지를 검색하고 '다른 이름으로 저장'을 선택하면 이미지가 PNG가되고 파일 크기가 60-70 % 커집니다. 다음은 변환을 수행하는 함수입니다. 아무도 왜 이것이 일어나고 있는지 제안 할 수 있습니까?업로드 된 jpeg를 바이트 배열로 변환 할 때 png로 끝나나요?

private byte[] ResizeImage(UploadedFile file, int maxWidth, int maxHeight) 
{ 
    int canvasWidth = maxWidth; 
    int canvasHeight = maxHeight; 

    using (Bitmap originalImage = new Bitmap(file.InputStream)) 
    { 
     int originalWidth = originalImage.Width; 
     int originalHeight = originalImage.Height; 

     Bitmap thumbnail = new Bitmap(canvasWidth, canvasHeight); // create thumbnail canvas 

     using (Graphics g = Graphics.FromImage((System.Drawing.Image)thumbnail)) 
     { 
      g.SmoothingMode = SmoothingMode.Default; 
      g.InterpolationMode = InterpolationMode.Default; 
      g.PixelOffsetMode = PixelOffsetMode.Default; 



      //Get the ratio of original image  
      double ratioX = (double)canvasWidth/(double)originalWidth; 
      double ratioY = (double)canvasHeight/(double)originalHeight; 
      double ratio = ratioX < ratioY ? ratioX : ratioY; // use which ever multiplier is smaller 

      // Calculate new height and width  
      int newHeight = Convert.ToInt32(originalHeight * ratio); 
      int newWidth = Convert.ToInt32(originalWidth * ratio); 

      // Calculate the X,Y position of the upper-left corner  
      // (one of these will always be zero)  
      int posX = Convert.ToInt32((canvasWidth - (originalWidth * ratio))/2); 
      int posY = Convert.ToInt32((canvasHeight - (originalHeight * ratio))/2); 

      //g.Clear(Color.White); // Add white padding 

      g.DrawImage(originalImage, posX, posY, newWidth, newHeight); 

     } 

     /* Display uploaded image preview */ 
     ImageConverter converter = new ImageConverter(); 
     byte[] imageData = (byte[])converter.ConvertTo(thumbnail, typeof(byte[])); // Convert thumbnail into byte array and set new binary image 

     return imageData; 
    } 
} 
+0

저는 C# 전문가는 아니지만 'Bitmap originalImage = new Bitmap (file.InputStream)'을 사용하여 JPG를 비트 맵으로 변환하는 것입니까? PNG는 비트 맵 형식이므로 'originalImage'는 PNG로 제공됩니다. – gaborsch

답변

4

나는 ImageConverter 다른 형식을 지원인지 확실하지, 그래서 더 많은 제어를 원하는 경우, (압축 수준을 지정 예)

byte[] imageData; 
using (MemoryStream stream = new MemoryStream()) 
{ 
    thumbnail.Save(stream, ImageFormat.Jpeg); 
    imageData = stream.ToArray(); 
} 
return byteArray; 

을 시도 this 체크 아웃.

+0

고마워, 그게 정말 잘 작동 해. 또한 품질의 눈에 띄는 손실없이 원본 JPEG를 약 40kb에서 7kb로 줄입니다! 굉장해. – lnelson92

0

ImageConverter의 문서는 조금 부족한 것 같다,하지만 추측은 별도로 명시하지 않는 한 PNG로 변환하는 기본값은 (심지어 다른 형식을 지원한다고 가정)이다.