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();
這看起來很有趣,因爲在調整大小時會失去透明度:http://stackoverflow.com/questions/753968/why-does -resizing-A-PNG圖像,失去透明度 – Lucas