Я просто получил реальное удивление, когда я загрузил jpg файл и обернулся и сохранил его с качеством 100, и размер был почти 4x оригинал. Для дальнейшего исследования я открываюсь и сохраненный, явно не устанавливая качество, и размер файла был точно тем же. Я полагал, что это было то, потому что ничто не изменилось так, это просто записывает те же самые биты обратно в файл. Для тестирования этого предположения, я провел большую линию по диагонали через изображение и сохранил снова, не устанавливая качество (на этот раз, я ожидал, что файл подпрыгнет, потому что это будет "грязно"), но это уменьшило ~10Kb!
В этой точке я действительно не понимаю то, что происходит, когда я просто называю Изображение. Сохраните () w/out определение качества сжатия. Как размер файла так близок (после того, как изображение изменяется) к первоначальному размеру, когда никакое качество еще не установлено, когда я установил качество на 100 (в основном никакое сжатие), размер файла несколько раз больше, чем оригинал?
Я прочитал документацию относительно Изображения. Сохраните (), и это испытывает недостаток в любой детали о том, что происходит негласно. Я погуглил во все стороны, я могу думать, но я не могу найти дополнительную информацию, которая объяснила бы, что я вижу. Я работал в течение 31 часа прямо поэтому, возможно, я пропускаю что-то очевидное; 0)
Все это появилось, в то время как я реализую некоторые методы библиотеки для сохранения образов к базе данных. Я перегрузил наш метод "SaveImage", чтобы позволить явно устанавливать качество, и во время моего тестирования я столкнулся с нечетным (мне) результаты, объясненные выше. Любой свет, который можно пролить, будет цениться.
Вот некоторый код, который проиллюстрирует то, что я испытываю:
string filename = @"C:\temp\image testing\hh.jpg";
string destPath = @"C:\temp\image testing\";
using(Image image = Image.FromFile(filename))
{
ImageCodecInfo codecInfo = ImageUtils.GetEncoderInfo(ImageFormat.Jpeg);
// Set the quality
EncoderParameters parameters = new EncoderParameters(1);
// Quality: 10
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 10L);
image.Save(destPath + "10.jpg", codecInfo, parameters);
// Quality: 75
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 75L);
image.Save(destPath + "75.jpg", codecInfo, parameters);
// Quality: 100
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 100L);
image.Save(destPath + "100.jpg", codecInfo, parameters);
// default
image.Save(destPath + "default.jpg", ImageFormat.Jpeg);
// Big line across image
using (Graphics g = Graphics.FromImage(image))
{
using(Pen pen = new Pen(Color.Red, 50F))
{
g.DrawLine(pen, 0, 0, image.Width, image.Height);
}
}
image.Save(destPath + "big red line.jpg", ImageFormat.Jpeg);
}
public static ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
return ImageCodecInfo.GetImageEncoders().ToList().Find(delegate(ImageCodecInfo codec)
{
return codec.FormatID == format.Guid;
});
}