[英]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.