0

在以下特定情况下,我很难将 lumia 成像 SDK 2.0 代码转换为 SDK3.0。我曾经在 Windows phone 8.1 RT 应用程序中使用以下代码来增加/降低 JPG 文件的图像质量:

using (StreamImageSource source = new StreamImageSource(fileStream.AsStreamForRead()))
                    {
                        IFilterEffect effect = new FilterEffect(source);
                        using (JpegRenderer renderer = new JpegRenderer(effect))
                        {
                            renderer.Quality = App.COMPRESSION_RATIO / 100.0; // higher value means better quality
                            compressedImageBytes = await renderer.RenderAsync();
                        }
                    }

现在由于在 SDK 3.0 中 FilterEffect 类已被 EffectList() 替换,我将代码更改为

 using (BufferProviderImageSource source = new BufferProviderImageSource(fileStream.AsBufferProvider()))
                {
                    using (JpegRenderer renderer = new JpegRenderer())
                    {
                        IImageProvider2 source1 = new EffectList() { Source = source };
                        renderer.Source = source1;                    
                        renderer.Quality = App.COMPRESSION_RATIO / 100.0;
                        try
                        {
                            var img = await renderer.RenderAsync();
                        }
                        catch (Exception ex)
                        {
                            ;
                        }
                    }
                }

我收到 InvalidCastException 异常。我尝试了几种组合,但没有运气。

4

3 回答 3

0

很抱歉,工作代码使用的是 BufferProviderImageSource 而不是 StreamImageSource。下面是片段。这里有几点:

1)如果我不使用 Size 属性,我会得到“找不到组件异常”。

2)GetInfoAsync():是的,上面的代码没有用,但我需要用它来知道图像是横向还是纵向,以便我可以初始化结果图像的 Size 属性。

3) 如果肖像图像的尺寸属性超过 1024x1024,我会收到异常“值不在预期范围内”

为什么 lumia 让这个版本变得如此棘手。:(

  var stream = FileIO.ReadBufferAsync(file);

            using (var source = new BufferProviderImageSource(stream.AsBufferProvider()))
            {
                EffectList list = new EffectList() { Source = source };
                using (JpegRenderer renderer = new JpegRenderer(list))
                {
                    renderer.Quality = App.COMPRESSION_RATIO / 100.0;
                    renderer.OutputOption = OutputOption.PreserveAspectRatio;
                    try
                    {
                        var info = await source.GetInfoAsync();
                        double width = 0;
                        double height = 0;
                        if (info.ImageSize.Width > info.ImageSize.Height) //landscape
                        {
                            width = 1024;
                            height = 765;
                            if (info.ImageSize.Width < 1024)
                                width = info.ImageSize.Width;
                            if (info.ImageSize.Height < 765)
                                height = info.ImageSize.Height;
                        }
                        else //portrait..
                        {
                            width = 765;
                            height = 1024;
                            if (info.ImageSize.Width < 765)
                                width = info.ImageSize.Width;
                            if (info.ImageSize.Height < 1024)
                                height = info.ImageSize.Height;
                        }

                        renderer.Size = new Size(width, height);
                        compressedImageBytes = await renderer.RenderAsync();
                    }
                    catch (Exception ex)
                    {
                        new MessageDialog(ex.Message).ShowAsync();
                    }
                }
            }
于 2016-01-11T08:49:16.300 回答
0

我在 VS 2015 社区版。在挖掘这个问题时,我得到了与 SDK 2.0 完全相同的代码。我所做的只是指定了 JpegRenderer 的大小。它适用于所有横向图像,但无法将纵向图像转换为正确的方向。也不例外,但纵向图像的结果是广泛拉伸的横向图像。我将肖像图像的大小初始化为 Size(765, 1024) 但没有影响。

 using (JpegRenderer renderer = new JpegRenderer(source))
                    {
                        renderer.Quality = App.COMPRESSION_RATIO / 100.0;

                        try
                        {
                            var info = await source.GetInfoAsync();
                            renderer.Size = new Size(1024, 765);
                            compressedImageBytes = await renderer.RenderAsync();

                        }
                        catch (Exception ex)
                        {
                            new MessageDialog("Error while compressing.").ShowAsync();
                        }
                    }
于 2016-01-10T18:58:34.963 回答
0

我真的不知道 InvalidCastException 发生了什么,我们可以在评论中继续讨论,因为它很可能需要反复讨论。

也就是说,您可以在没有效果列表的情况下继续,并以正常方式连锁效果。所以要重写你的场景:

using (var soruce = new StreamImageSource(...))
using (var renderer = new JpegRenderer(source))
{
    renderer.Quality = App.COMPRESSION_RATIO / 100.0;
    var img = await renderer.RenderAsync();
}

如果您想添加效果(例如 CarttonEffect),只需执行以下操作:

using (var soruce = new StreamImageSource(...))
using (var caroonEffect = new CartoonEffect(source))
using (var renderer = new JpegRenderer(caroonEffect))
{
    renderer.Quality = App.COMPRESSION_RATIO / 100.0;
    var img = await renderer.RenderAsync();
}

等等。如果您有效果 A、B、C 和 D,只需创建一个链 Source -> A -> B -> C -> D -> JpegRenderer。

于 2016-01-08T07:56:48.903 回答