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