.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);
}