У меня есть задача, которая включает в себя несколько частей, с большинством из которых у меня нет проблем. Мне нужна функция, которая считывает поток изображения, автоматически изменяет его размер до указанного размера, сжимает изображение до определенного уровня (если применимо), а затем возвращает поток изображения, но также сохраняет исходный формат изображения и сохраняет прозрачность (если есть любой.)
Это включает в себя простую функцию изменения размера, с которой у меня нет проблем.
Он включает в себя чтение исходного формата изображения, и этот код работает:
// 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();