2011-11-22 52 views
3

我有一個挑戰,涉及多個部分,其中大部分我沒有問題。我需要一個讀取圖像流的函數,將它自動調整爲指定的大小,將圖像壓縮到特定的級別(如果適用),然後返回圖像流,但也保留原始圖像格式並保持透明度(如果存在任何。)以其各自的格式保存圖像到流

這涉及到一個簡單的調整大小功能,這與我沒有問題。

它包括讀取原始圖像格式,該代碼似乎工作:

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

返回圖像流就是我卡住了。我可以用壓縮返回一個流,但它默認爲Jpeg。我看不到在哪裏指定格式。當我通過保存圖像兩次指定格式時,我失去了透明度。

我想有兩個問題:

1)如果我調整圖像大小,是否也需要重建一個PNG alpha透明度? 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 -resizing-A-PNG圖像,失去透明度 – Lucas

回答

2

這就是我使用,雖然我沒有測試透明度。這使圖像保持其原始格式,而無需切換爲原始格式。你可能默認爲JPEG的原因是,newImage.RawFormat回來的GUID的格式,但不是實際的枚舉值:

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文件)。

相關問題