2011-11-17 2 views
1

사이트에 사용자 갤러리가 있으며 방문자가 일부 이미지를 업로드 할 수 있습니다. 업로드 후 이미지는 미리 정의 된 사전 설정으로 리사이즈해야합니다. 또한 원본 이미지도 저장해야합니다. 모두 pngbmp 이미지 형식에서 정상적으로 작동합니다. 그러나 gif 형식을 업로드하거나 jpeg을 우위로 업로드하면 업로드 된 원본 이미지가 압축 된 것처럼 보입니다. 예를 들어품질 저하없이 이미지 업로드

:

원본 :
Original image

업로드 :
Uploaded image

내가 thorougly 구글에서 검색하는 방법과 이미지를 오른쪽으로 업로드하는 몇 가지 예를 발견했다. 끝에서 나는 다음 방법 작성했습니다 :

void UploadImagePreset(Image image, ImageFormat imgFormat, string imgPath) 
{ 
    using (var uploadStream = imageUploader.CreateUploadStream(imagePath)) 
    { 
     var newWidth = image.Width; 
     var newHeight = image.Height; 
     using (var outBitmap = new Bitmap(newWidth, newHeight)) 
     { 
      using (var outGraph = Graphics.FromImage(outBitmap)) 
      { 
       outGraph.CompositingQuality = CompositingQuality.HighQuality; 
       outGraph.SmoothingMode = SmoothingMode.HighQuality; 
       outGraph.PixelOffsetMode = PixelOffsetMode.HighQuality; 
       outGraph.InterpolationMode = InterpolationMode.HighQualityBicubic; 

       var imageRect = new Rectangle(0, 0, newWidth, newHeight); 
       outGraph.DrawImage(image, imageRect); 

       outBitmap.Save(uploadStream, imgFormat); 
      } 
     } 
    } 
} 

를하지만 도움이되지 않았다. 업로드 된 이미지는 위에서 설명한 것과 동일합니다. 나는이 같은 결과 이미지의 qaulity를 지정하는 tryied 한 :

var encoderParameters = new EncoderParameters(); 
var encoderParameter = new EncoderParameter(Encoder.Quality, 100); 
encoderParameters.Param[0] = encoderParameter; 
var encoder = ImageCodecInfo.GetImageEncoders() 
    .Where(e => e.FormatID == imgFormat.Guid) 
    .FirstOrDefault(); 
outBitmap.Save(uploadStream, encoder, encoderParameters); 

너무 작동하지 않습니다. 또한 jpeg 이미지를 업로드 할 때 예외가 발생합니다.

압축하거나 크기를 조정하지 않고 이미지를 업로드하는 방법은 무엇입니까? 나는이 문제를 해결하려고 노력하고 몇 시간을 보냈다.

+0

업로드가 어떻게되는지는 확실하지 않습니다. 추가 클라이언트 코드가없는 브라우저에서만 클라이언트에있는 정확한 파일을 가져와야합니다. 문제가 업로드 (또는 ASP.NET)에 아무런 영향을 미치지 않으며 * 단지 * 일뿐입니다. 크기 조정과 관련있다. –

+0

여분의 클라이언트 코드없이 FileUpload 컨트롤을 사용합니다. –

+0

맞습니다. 업로드 된 파일을 처리하지 않고 * 저장하면 * 똑같은 파일로 끝납니다. 자신에게 그 사실을 입증하면 업로드 부분을 방정식에서 제거 할 수 있습니다. 가능한 한 작은 영역으로 문제를 좁히십시오. –

답변

7

업로드 된 이미지를 Image 클래스를 통해 전달하고 있습니다.이 스트림은 전달 된 스트림을 기반으로 이미지입니다.

그러면 기본 매개 변수를 사용하여 저장됩니다.이 매개 변수는 더 이상 원본 이미지를 반영하지 않습니다.

들어오는 스트림을 디스크에 직접 저장하면 원본 이미지와 정확히 일치하게됩니다. 이처럼

(.NET 4.0) :

using (var uploadStream = imageUploader.CreateUploadStream(imagePath)) 
{ 
    using(var fileStream = new FileStream(imgPath, FileMode.Create)) 
    { 
     uploadStream.CopyTo(fileStream); 
    } 
} 

또는 (사전에 .NET 4.0) : this answer에서 적응

using (var uploadStream = imageUploader.CreateUploadStream(imagePath)) 
{ 
    using(var fileStream = new FileStream(imgPath, FileMode.Create)) 
    { 
     byte[] buffer = new byte[32768]; 
     int read; 
     while ((read = uploadStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      fileStream.Write(buffer, 0, read); 
     } 
    } 
} 

.

+0

.Net 3.5를 사용합니다. 이 버전의 프레임 워크에서는 Stream 클래스에 CopyTo 메서드가 없습니다. –

+0

@IgorBlinnikov - 다른 옵션은 다음을 참조하십시오. http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances-c-sharp – Oded

+0

감사합니다. 당신의 대답은 매우 도움이되었습니다. 문제는 제가 먼저 Stream에서 Image 객체를 생성하고 Stream을 저장했기 때문입니다. Stream 객체로 조작하면 원래의 Stream을 저장하더라도 결과 이미지에 노이즈가 추가되지만 Image 객체는 저장하지 않습니다. 업로드 후 이미지 객체를 만들기 전에 스트림을 파일에 직접 저장하면 내 문제가 해결됩니다. –

1

무손실 이미지 압축을 위해 Image Codec (두 번째 예)을 사용하는 것이 좋습니다. 코드의 작은 수정으로

난 당신이 시도하는 것이 좋습니다 :이 도움이 될 것입니다

Bitmap bm = (Bitmap)Image.FromFile(filePath); 
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo codecInfo = null; 
foreach (ImageCodecInfo codec in codecs) 
{ 
    if (codec.MimeType == "image/jpeg") 
     codecInfo = codec; 
} 
EncoderParameters ep = new EncoderParameters(); 
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100); 
bm.Save("C:\\quality" + x.ToString() + ".jpg", codecInfo, ep); 

희망.

+0

나는 이미지를 그대로 업로드해야합니다. 형식을 jpeg로 변경할 수 없습니다. 사용자가 * .png 이미지를 업로드 한 경우 png로 저장해야합니다. –

+0

이것은 나를 위해 완벽하게 작동했습니다. 같은 +1. :) –