Bmp к jpg/png в C#

В вашем коде ваше первое ожидание выполнения задачи, но вы не запустили ее, так что она ждет бесконечно. Попробуйте следующее:

Task task = GetCustomers();
task.RunSynchronously();

Изменить:

Вы говорите, что получаете исключение. Пожалуйста, напишите более подробную информацию, включая трассировку стека. Mono содержит следующий тестовый пример:

[Test]
public void ExecuteSynchronouslyTest ()
{
        var val = 0;
        Task t = new Task (() => { Thread.Sleep (100); val = 1; });
        t.RunSynchronously ();

        Assert.AreEqual (1, val);
}

Проверьте, работает ли это для вас. Если это не так, но очень маловероятно, у вас может быть некоторая нечетная сборка Async CTP. Если это сработает, вам может потребоваться изучить, что именно генерирует компилятор, и как Task экземпляр отличается от этого образца.

Редактировать # 2:

Я проверил с Reflector, что описанное вами исключение возникает, когда m_action - null. Это странно, но я не эксперт в Async CTP. Как я уже сказал, вы должны декомпилировать свой код и посмотреть, как именно создается Task, каким образом его m_action является null.


P.S. В чем дело с случайными сокращениями? Учиться разрабатывать?

53
задан Ramesh Soni 4 September 2008 в 06:33
поделиться

5 ответов

var qualityEncoder = Encoder.Quality;
var quality = (long)<desired quality>;
var ratio = new EncoderParameter(qualityEncoder, quality );
var codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">;
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG
55
ответ дан aku 7 November 2019 в 18:39
поделиться
public static class BitmapExtensions
{
    public static void SaveJPG100(this Bitmap bmp, string filename)
    {            
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static void SaveJPG100(this Bitmap bmp, Stream stream)
    {
        EncoderParameters encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters);
    }

    public static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }

        return null;
    }
}
33
ответ дан 7 November 2019 в 08:39
поделиться

Просто хочу сказать, что JPEG является по своей природе форматом с потерями. Таким образом в thoery даже при самых высоких настройках Вы собираетесь иметь некоторую информационную потерю, но это во многом зависит от изображения. Но png без потерь.

1
ответ дан paan 7 November 2019 в 18:39
поделиться

Существенно Вы не будете в состоянии сохранить то же качество, потому что jpg (насколько я знаю), всегда с потерями даже с максимально возможными качественными настройками.

, Если разрядно-точное качество действительно важно, рассмотрите использование png, который имеет некоторые режимы, которые без потерь.

1
ответ дан James Ogden 7 November 2019 в 18:39
поделиться

Можно попробовать:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic;

и

Bitmap.CompositingQuality = CompositingQuality.HighQuality;

, Который действительно сохраняет качество довольно высоко, но не максимально возможное.

0
ответ дан GateKiller 7 November 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: