Изображения.сохранить - параметр является недействительным.
Я начинаю с потока, который представляет собой изображение, и рисую его на более крупном изображении. Для этого я написал метод расширения для
MemoryStream
s. Когда я пытаюсь сохранить изображение в новый поток, код выдает исключение "параметр недопустим".Факты:
- Поток, на котором я вызываю метод, не является нулевым и содержит данные.
- Когда я добираюсь до рассматриваемого утверждения, новое изображение не является нулевым, и кодер кажется правильным.
- Получение
MemoryStream
объект не является нулевым (действительно, это вызвало бы совершенно другое исключение).Я понятия не имею, почему я получаю это исключение.
Как вы можете видеть, я делаю использование
using
операторы, но ничто не выходит за рамки области действия, когда я добираюсь до оператора, который вызывает исключение, и исключение не указывает, какой параметр является недопустимым.Примечание -
GetEncoder
метод был записан в black-box и очистил методы, которые должны были использовать этот код. Как было указано выше, Кодер, по-видимому, действителен.public static MemoryStream AddMatting(this MemoryStream stream, Size size, Color color) { MemoryStream newStream = new MemoryStream(); using (Image image = Bitmap.FromStream(stream)) { using (Bitmap matting = new Bitmap(size.Width, size.Height, image.PixelFormat)) { using (Graphics g = Graphics.FromImage(matting)) { int x = (int)((matting.Width-image.Width)*0.5); int y = (int)((matting.Height-image.Height)*0.5); g.Clear(color); g.DrawImage(image, x, y); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); using (EncoderParameters encParams = new EncoderParameters(1)) { encParams.Param[0] = new EncoderParameter(Encoder.Quality, 100); try { matting.Save(newStream, jpgEncoder, encParams); } catch (Exception ex) { if (ex != null) {} } } } } } return newStream; }
Что я уже пробовал:
0) я добавил
true,true
для вызова метода FromStream
, думая, может быть, как-то, что поток был недействительным, но это не вызвало ArgumentInvalid
исключение, так что сам поток действителен).1) я попытался свести метод к его простейшей форме (которая берет входящий поток, делает его изображением, а затем сохраняет его обратно в новый поток), и все равно получаю исключение:
public static MemoryStream AddMatting(this MemoryStream stream, Size size, Color color) { MemoryStream newStream = new MemoryStream(); using (var image = Bitmap.FromStream(stream)) { ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); using (EncoderParameters encoderParameters = new EncoderParameters(1)) { encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100); try { image.Save(newStream, jpgEncoder, encoderParameters); } catch (Exception ex) { if (ex != null) {} } } } return newStream; }