Что действительно Отображает уровень качества. Сохранить () использование для jpeg файлов?

Я просто получил реальное удивление, когда я загрузил 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;
    });
}
33
задан Steve K 18 October 2010 в 08:15
поделиться