c# phone 8.1 更改 jpeg 质量

标签 c# windows-runtime windows-phone-8.1

我想从相机捕捉图像,减小其尺寸并降低质量。

到目前为止,这是我的功能:

private async void BildSpeichern(object sender, RoutedEventArgs e)
{
    MenuFlyoutItem FO = sender as MenuFlyoutItem;
    StorageFile datei = await StorageFile.GetFileFromPathAsync(_viewmodel.DateiPfad);

    string neuerDateiName=datei.Name + "___" + FO.CommandParameter.ToString();
    await datei.RenameAsync(neuerDateiName);
    _viewmodel.DateiPfad = datei.Path;

    using (var sourceStream = await datei.OpenAsync(FileAccessMode.ReadWrite))
    {
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(BitmapEncoder.JpegEncoderId, sourceStream);


        uint oriWidth = decoder.PixelWidth;
        uint oriHeight = decoder.PixelHeight;

        uint tarWidth;
        uint tarHeight;

        if (oriWidth > oriHeight)
        {
            tarWidth = 1024;
            tarHeight = (uint)((float)tarWidth / (float)oriWidth * (float)oriHeight);
        }
        else
        {
            tarHeight = 1024;
            tarWidth = (uint)((float)tarHeight / (float)oriHeight * (float)oriWidth);
        }

        InMemoryRandomAccessStream IS = new InMemoryRandomAccessStream();
        BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(IS, decoder);
        decoder = null;
        encoder.BitmapTransform.ScaledWidth = tarHeight;
        encoder.BitmapTransform.ScaledHeight = tarWidth;
        await encoder.FlushAsync();

    }
    await datei.CopyAsync(Windows.Storage.KnownFolders.PicturesLibrary,"TEST.JPG",NameCollisionOption.ReplaceExisting);

    FotoVorschau.Visibility = Visibility.Visible;
    FotoAnzeige.Visibility = Visibility.Collapsed;
    AufnahmeStackpanel.Visibility = Visibility.Visible;
    VorschauStackpanel.Visibility = Visibility.Collapsed;
    FotoAnzeige.Source = null;
    _viewmodel.DateiPfad = null;
}

我唯一缺少的是压缩,或者更确切地说,生成的 JPEG 图像质量下降。

我发现的唯一示例使用 System.Drawing,但它在 Windows Phone 8.1 项目中不可用...有人知道如何实现吗?

编辑: 这是我的新功能部分,但图像不会调整大小也不会被压缩:

using (var sourceStream = await datei.OpenAsync(FileAccessMode.ReadWrite))
            {
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(sourceStream);


                uint oriWidth = decoder.PixelWidth;
                uint oriHeight = decoder.PixelHeight;

                uint tarWidth;
                uint tarHeight;

                if (oriWidth > oriHeight)
                {
                    tarWidth = 1024;
                    tarHeight = (uint)((float)tarWidth / (float)oriWidth * (float)oriHeight);
                }
                else
                {
                    tarHeight = 1024;
                    tarWidth = (uint)((float)tarHeight / (float)oriHeight * (float)oriWidth);
                }

                var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
                var qualityValue = new Windows.Graphics.Imaging.BitmapTypedValue(
                    0.6,
                    Windows.Foundation.PropertyType.Single
                    );

                propertySet.Add("ImageQuality", qualityValue);

                BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, sourceStream, propertySet);
                PixelDataProvider pd = await decoder.GetPixelDataAsync();
                encoder.SetPixelData(decoder.BitmapPixelFormat, decoder.BitmapAlphaMode, oriWidth, oriHeight, decoder.DpiX, decoder.DpiY, pd.DetachPixelData());
                decoder = null;

                encoder.BitmapTransform.ScaledWidth = tarHeight;
                encoder.BitmapTransform.ScaledHeight = tarWidth;
                encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Cubic;

                await encoder.FlushAsync();
                sourceStream.Dispose();

            }

最佳答案

罗伯特提到的链接为我打开了文章的 HTML 版本,但是 XAML one有一些很好的样本:

IAsyncOperation<BitmapEncoder> CreateEncoderWithEncodingOptionsAsync(
    Windows.Storage.Streams.IRandomAccessStream stream
    )
{
    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);
    return Windows.Graphics.Imaging.BitmapEncoder.CreateAsync(
        Windows.Graphics.Imaging.BitmapEncoder.JpegEncoderId,
        stream,
        propertySet
        );

    // Encoder is initialized with encoding options.
}

关于c# phone 8.1 更改 jpeg 质量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27027643/

相关文章:

c# - 嵌套 ListView 中的 SelectedItems

c# - 后台任务在调试期间在生命周期事件中可见但不会自动运行

c# - 一种自动化MS Office VBA代码 "Compile"函数的方法

c++ - xAudio MasterVoice 取得进展

c# - Windows Phone 通过公共(public)共享库进行应用程序间通信

windows-8 - BackgroundUploader.getCurrentUploadsAsync()返回我做过的大多数传输

c# - 存储文件到系统 uri?

c# - ViewModel 成员的可见性应该是多少?

c# - 如何在进程中使用msinfo32.exe命令行?

c# - GC 会删除非静态类中的静态属性吗?