Имам предизвикателство, което включва множество части, с повечето от които нямам проблем. Имам нужда от функция, която чете поток от изображения, автоматично го преоразмерява до определен размер, компресира изображението до определено ниво (ако е приложимо) и след това връща потока от изображения, но също така запазва оригиналния формат на изображението и запазва прозрачността (ако има всякакви.)
Това включва проста функция за преоразмеряване, която работи, за мен няма проблем.
Това включва четене на оригиналния формат на изображението и този код изглежда работи:
// 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();