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

Я пытаюсь сохранить растровый формат jpg с указанным качеством кодирования. Однако я получаю исключение ("Параметр недействителен") при вызове метода сохранения.

Если я пропущу два последних параметра в bmp.save, все будет работать нормально.

        EncoderParameters eps = new EncoderParameters(1);
        eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 16);
        ImageCodecInfo ici = GetEncoderInfo("image/jpeg");
        string outfile = outputpath + "\\" + fileaddition + sourcefile.Name;
        bmp.Save(outfile,ici,eps );

        bmp.Dispose();
        image.Dispose();
        return true;
    }
    ImageCodecInfo GetEncoderInfo(string mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j)
        {
            if (encoders[j].MimeType == mimeType)
                return encoders[j];
        }
        return null;
    }
}

Спасибо


person CruelIO    schedule 21.12.2008    source источник


Ответы (2)


GDI+ довольно ненадежный. Вам нужно будет использовать 16L для значения или приведения к (long).

person Hans Passant    schedule 21.12.2008
comment
В VB я без проблем использовал стандартное 32-битное целое число для значения качества. - person Ady; 21.12.2008
comment
Это. Тип литерала 16 — byte в C#, Integer в VB.NET. EncoderParameter имеет конструкторы, которые принимают byte, short и long, но не int. Вы получите правильный вариант в VB, но не в C#. - person Hans Passant; 29.12.2008
comment
nobugz: Нет, это неправильно. Стандарт говорит в §9.4.4.2, что «[i]если литерал не имеет суффикса, он имеет первый из этих типов, в которых может быть представлено его значение: int, uint, long, ulong». Это никогда byte. Или, может быть, это ошибка в компиляторе Microsoft C#? - person Konrad Rudolph; 23.08.2009
comment
Вы легенда. Спасибо мне тоже помогло. - person Aaron; 24.02.2011
comment
Спасибо. Это случилось и со мной. - person crdx; 29.06.2012
comment
Спасибо, мне бы потребовалось некоторое время, чтобы понять это самостоятельно - person Peter Moberg; 20.12.2013
comment
Неуклюжий звучит как лучшее слово для описания этого; моей первой реакцией было то, что я столкнулся с ошибкой! - person Roman Starkov; 23.03.2015

Вы должны привести значение качества к длинному, например:

eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)16);
person Mahdi    schedule 23.08.2009