.NET Сохранение jpeg с тем же качеством, которое было загружено

У меня есть цифровая камера пушки, и я установил ее для съемки с превосходным качеством, и она выводит файл .jpg размером 3 мегабайта. Если я загружу его так, как в ASP.NET(это полезно, чтобы изменить его разрешение dpi или обрезать его или whaterver)

imgPicture = Image.FromFile(Config.WorkDirectory + this.TempPhotoName);
bmpPicture = new Bitmap(imgPicture);

а затем снова сохраните его следующим образом:

bmpModified.Save(Config.WorkDirectory + this.TempPhotoName,System.Drawing.Imaging.ImageFormat.Jpeg);

он выводит jpg, размер которого составляет всего 700 КБ. Потеря качества.

Я также попытался сохранить его так:

bmpPicture.Save(Config.WorkDirectory + this.TempPhotoName, codecJpeg, encparams);

где codecJpeg

ImageCodecInfo codecJpeg = this.getEncoderInfo("image/jpeg");


    private ImageCodecInfo getEncoderInfo(string mimeType)
    {
        // Get image codecs for all image formats
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        // Find the correct image codec
        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return codecs[i];
        return null;
    }

и encparams:

EncoderParameters encparams = new EncoderParameters(1);
encparams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 97L);

Таким образом, размер (и я подозреваю, что качество) поддерживается, но я ввожу качество вручную.

Я хочу спросить:

Есть ли способ сохранить изображение с тем же качеством, которое было загружено без жесткого кодирования качества?

Заранее благодарю

Ответы

Ответ 1

Итак, похоже, что вы знаете, как установить качество, вам просто нужно знать, как получить качество от исходного изображения?

Я подозреваю, что Image.PropertyItems является вашим другом, если качество находится в метаданных для начала. (Я не знаю, есть ли даже стандартная шкала для качества в кодировщиках JPEG.)

EDIT: Я только что проверил, и в jpeg, который я загрузил, не было никаких тегов для качества.

Один из вариантов может заключаться в том, чтобы определить, насколько большой файл должен иметь примерно одинаковое качество, а затем сохранить его несколько раз, выполняя двоичный поиск, чтобы выработать наиболее подходящее качество. Icky, но это может сработать.

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

Ответ 2

Прочитайте здесь, как сохранить изображение без повторного кодирования изображения: How-to: перекодировать изображение JPEG с метаданными.

Однако, если вы обрезаете или манипулируете другими изображениями, это невозможно сделать без потери качества (хорошо технически можно сделать потерю урожая, если вы работаете с границами, которые умножаются на 16, но AFAIK не может быть сделанные с библиотеками, доступными в .net).

Ответ 3

Вы должны использовать дополнительные параметры, которые сообщают GDI + об обнаружении цветовой схемы.

Например:

using (var img = Image.FromStream(fileupload.InputStream, true,true))
{
    img.Save(fileOnDisk, ImageFormat.Jpeg);
}

using (var img = Image.FromFile("yourimage", true))
{
    img.Save(fileOnDisk, ImageFormat.Jpeg);
}