簡體   English   中英

無法將Lumia Imaging SDK2.0移植到SDK 3.0(UWP)

[英]Unable to port Lumia imaging SDK2.0 to SDK 3.0(UWP)

在以下特定情況下,我很難將lumia Imaging 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();
                        }
                    }

現在,由於SDKE中的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異常。 我嘗試了幾種組合,但沒有運氣。

我真的不知道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。

我使用的是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();
                        }
                    }

抱歉,工作代碼正在使用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();
                    }
                }
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM