2011-11-22 2 views
3

여러 부분으로 구성된 문제가 있습니다. 대부분 문제는 없습니다. 이미지 스트림을 읽고, 지정된 크기로 자동으로 크기를 조정하고, 특정 레벨 (해당되는 경우)로 이미지를 압축 한 다음 이미지 스트림을 반환하는 기능과 원본 이미지 형식을 유지하고 투명성을 유지하는 기능이 필요합니다. any).해당 형식의 이미지를 스트림에 저장하십시오.

이 작업에는 간단한 크기 조정 기능이 포함되어 있습니다. 문제가 없습니다.

그것은 원래의 이미지 형식을 읽는 포함하고,이 코드가 작동하는 것 같다 : 나는 붙어있어 어디 이미지 스트림을 반환

// Detect image format 
if (newImage.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg)) 
{ 
     //etc for other formats 
} 
//etc 

이다. 압축 된 스트림을 반환 할 수 있지만 기본값은 JPEG입니다. 형식을 지정할 위치가 표시되지 않습니다. 그리고 이미지를 두 번 저장하여 형식을 지정하면 투명도가 손실됩니다.

나는이 개 질문이 추측 :

1) 나는 이미지의 크기를 조절하면, 나는 또한 PNG의 알파 투명도를 다시해야합니까? 2) 필요할 때 투명도를 유지하면서 각 형식의 메모리 스트림에 어떻게 저장할 수 있습니까?

여기 내 코드가 잘못되었습니다.

System.Drawing.Imaging.ImageCodecInfo[] Info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders(); 
System.Drawing.Imaging.EncoderParameters Params = new System.Drawing.Imaging.EncoderParameters(1); 
long ImgComp = 80; 
Params.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ImgComp); 

MemoryStream m_s = new MemoryStream(); 
// Detect image format 
if (newImage.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg)) 
{ 
    newBMP.Save(m_s, ImageFormat.Jpeg); 
} 
else if (newImage.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png)) 
{ 
    newBMP.Save(m_s, ImageFormat.Png); 
} 

// Save the new graphic file to the server 

newBMP.Save(m_s, Info[1], Params); 
retArr = m_s.ToArray(); 
+0

사이즈를 재조정 할 때 투명성을 잃어 버리는 것에 대한 흥미로운 점이있다. http://stackoverflow.com/questions/753968/why-does 이미지를 잃는 투명화 – Lucas

답변

2

투명성을 테스트하지는 않았지만 이것은 내가 사용하는 것입니다. 이렇게하면 원본 형식으로 전환하지 않고 이미지를 원래 형식으로 유지합니다.

using (Bitmap newBmp = new Bitmap(size.Width, size.Height)) 
    { 
     using (Graphics canvas = Graphics.FromImage(newBmp)) 
     { 
      canvas.SmoothingMode = SmoothingMode.HighQuality; 
      canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      canvas.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      canvas.DrawImage(newImage, new Rectangle(new Point(0, 0), size)); 
      using (var stream = new FileStream(newLocation, FileMode.Create)) 
      { 
       // keep image in existing format 
       var newFormat = newImage.RawFormat; 
       var encoder = GetEncoder(newFormat); 
       var parameters = new EncoderParameters(1); 
       parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 

       newBmp.Save(stream, encoder, parameters); 
       stream.Flush(); 
      } 
     } 
    } 

편집 난 그냥 PNG에 투명성이 테스트

: 당신은 아마 JPEG로 디폴트되는 이유는 newImage.RawFormat 다시 형식의 GUID로되어 있지만 실제 열거 값이다 , 그리고 그것을 유지했다. 나는 그것을 잘 알고있다. (지금까지 jpeg를 위해서만 사용했다.)

관련 문제