Улучшите качество блита (Winrt C#)

Я на самом деле пытаюсь сделать одно и уникальное изображение холста с несколькими вещами на нем.

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

Это конец моего кода, когда я сохраняю изображение:

    StorageFile filesave = await ApplicationData.Current.LocalFolder.CreateFileAsync("filesave.jpg", CreationCollisionOption.ReplaceExisting);

    Guid encoderId = Windows.Graphics.Imaging.BitmapEncoder.JpegEncoderId;
    await WinRTXamlToolkit.Imaging.WriteableBitmapSaveExtensions.SaveToFile(backgroundBmp, filesave, encoderId);

Если у кого есть идея? Спасибо за ваше время, привет.

1 ответ

Это источник метода SaveToFile:

    /// <summary>
    /// Saves the WriteableBitmap to the given file with the specified BitmapEncoder ID.
    /// </summary>
    /// <param name="writeableBitmap">The writeable bitmap.</param>
    /// <param name="outputFile">The output file.</param>
    /// <param name="encoderId">The encoder id.</param>
    /// <returns></returns>
    public static async Task SaveToFile(
        this WriteableBitmap writeableBitmap,
        StorageFile outputFile,
        Guid encoderId)
    {
        Stream stream = writeableBitmap.PixelBuffer.AsStream();
        byte[] pixels = new byte[(uint)stream.Length];
        await stream.ReadAsync(pixels, 0, pixels.Length);

        using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            var encoder = await BitmapEncoder.CreateAsync(encoderId, writeStream);
            encoder.SetPixelData(
                BitmapPixelFormat.Bgra8,
                BitmapAlphaMode.Premultiplied,
                (uint)writeableBitmap.PixelWidth,
                (uint)writeableBitmap.PixelHeight,
                96,
                96,
                pixels);
            await encoder.FlushAsync();

            using (var outputStream = writeStream.GetOutputStreamAt(0))
            {
                await outputStream.FlushAsync();
            }
        }
    }

BitmapEncoder.CreateAsync Метод имеет перегрузку, которая добавляет параметр для указания списка параметров кодирования. Примером параметра параметров кодирования является

var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();

var qualityValue = new Windows.Graphics.Imaging.BitmapTypedValue(
    1.0, // Maximum quality
    Windows.Foundation.PropertyType.Single
    );

propertySet.Add("ImageQuality", qualityValue);
var encoder = await BitmapEncoder.CreateAsync(
    encoderId,
    writeStream
    propertySet);

Вы могли бы написать SaveToJpg как:

    /// <summary>
    /// Saves the WriteableBitmap to the given JPG file with the specified image quality.
    /// </summary>
    /// <param name="writeableBitmap">The writeable bitmap.</param>
    /// <param name="outputFile">The output file.</param>
    /// <param name="imageQuality">Valid values from 0 to 1.0. Higher values indicate higher quality.</param>
    /// <returns></returns>
    public static async Task SaveToJpg(
        WriteableBitmap writeableBitmap,
        StorageFile outputFile,
        double imageQuality = 1.0 // Maximum quality
    )
    {
        Stream stream = writeableBitmap.PixelBuffer.AsStream();
        byte[] pixels = new byte[(uint)stream.Length];
        await stream.ReadAsync(pixels, 0, pixels.Length);

        using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
            var qualityValue = new Windows.Graphics.Imaging.BitmapTypedValue(
                imageQuality,
                Windows.Foundation.PropertyType.Single
                );
            propertySet.Add("ImageQuality", qualityValue);
            var encoder = await BitmapEncoder.CreateAsync(
                BitmapEncoder.JpegEncoderId,
                writeStream
                propertySet);
            encoder.SetPixelData(
                BitmapPixelFormat.Bgra8,
                BitmapAlphaMode.Premultiplied,
                (uint)writeableBitmap.PixelWidth,
                (uint)writeableBitmap.PixelHeight,
                96,
                96,
                pixels);
            await encoder.FlushAsync();

            using (var outputStream = writeStream.GetOutputStreamAt(0))
            {
                await outputStream.FlushAsync();
            }
        }
    }
Другие вопросы по тегам