#realJSOP Ответов: 2

Изображения.сохранить - параметр является недействительным.


Я начинаю с потока, который представляет собой изображение, и рисую его на более крупном изображении. Для этого я написал метод расширения для MemoryStreams. Когда я пытаюсь сохранить изображение в новый поток, код выдает исключение "параметр недопустим".

Факты:
- Поток, на котором я вызываю метод, не является нулевым и содержит данные.
- Когда я добираюсь до рассматриваемого утверждения, новое изображение не является нулевым, и кодер кажется правильным.
- Получение 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;
}

2 Ответов

Рейтинг:
2

#realJSOP

Не берите в голову. Я сделал это без потоков, и все, что я хочу, происходит.


Рейтинг:
0

Thomas Daniels

Проблема заключается в параметре кодера: Качество должно быть длинным а не int[^].


Member 11979280

Большое вам спасибо)))