C# 在UWP中,图像未从Uri转换为位图图像

C# 在UWP中,图像未从Uri转换为位图图像,c#,bitmap,uwp,image-conversion,C#,Bitmap,Uwp,Image Conversion,我参考了下面的线程,将多个图像组合为uwp中的单个图像。 但是,对于从下面链接下载的磁贴,图像没有正确地从Uri转换为位图图像 public主页() { this.InitializeComponent(); 合并图像(); } 异步void MergeImages() { 字节[]画布=新字节[512*512*4]; Windows.Storage.Streams.IRandomAccessStream random=等待Windows.Storage.Streams.RandomAcce

我参考了下面的线程,将多个图像组合为uwp中的单个图像。

但是,对于从下面链接下载的磁贴,图像没有正确地从Uri转换为位图图像

public主页()
{
this.InitializeComponent();
合并图像();
}
异步void MergeImages()
{
字节[]画布=新字节[512*512*4];
Windows.Storage.Streams.IRandomAccessStream random=等待Windows.Storage.Streams.RandomAccessStreamReference.CreateFromUri(
新Uri(“https://a.tile.openstreetmap.org/1/0/0.png,UriKind.RelativeOrAbsolute)).OpenReadAsync();
Windows.Graphics.Imaging.BitmapDecoder解码器=等待Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(随机);
Windows.Graphics.Imaging.PixelDataProvider pixelData=等待解码器。GetPixelDataAsync();
字节[]tileImage=pixelData.DetachPixelData();
Canvas=PutOnCanvas(Canvas,tileImage,0,
0, 256, 256, 512);
InMemoryRandomAccessStream memStream=新建InMemoryRandomAccessStream();
var encoder=await BitmapEncoder.CreateAsync(Windows.Graphics.Imaging.BitmapEncoder.PngEncoderId,memStream);
编码器.SetPixelData(
Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8,
Windows.Graphics.Imaging.BitmapAlphaMode.Straight,
512,//像素宽度
512,//像素高度
96,//水平DPI
96,//垂直DPI
帆布);
尝试
{
等待编码器。FlushAsync();
var bitmapImage=新的bitmapImage();
等待bitmapImage.SetSourceAsync(memStream);
image.Source=位图图像;
}
捕获{}
memStream.Dispose();
}
字节[]PutOnCanvas(字节[]画布,字节[]图像,uint x,uint y,uint imageheight,uint imagewidth,uint画布宽度)
{
对于(uint row=y;row


我找到了您之前的两个线程:

它们都旨在避免闪烁效应。正如我在您的第二个线程中所评论的,闪烁效果是由您在短时间内更改图像的源引起的,如果您想要避免它,您可以使用动画以进度更改图像。下面是一个示例,使用
DoubleAnimation
Storyboard在第一个线程上为Images stackpanel的
Opacity
属性设置动画:

MainPage.xaml:我创建了两个情节提要,以使图像堆栈面板消失或显示,并为
消失情节提要
提供一个
消失情节提要(u
事件处理程序

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }
    bool replaceButtonClicked, replaceCustomButtonClicked, replaceTileButtonClicked;

    private void replace_Click(object sender, RoutedEventArgs e)
    {
        replaceButtonClicked = true;
        disappearStoryboard.Begin();
    }

    private void replaceCustom_Click(object sender, RoutedEventArgs e)
    {
        replaceCustomButtonClicked = true;
        disappearStoryboard.Begin();
    }

    private void replaceTile_Click(object sender, RoutedEventArgs e)
    {
        replaceTileButtonClicked = true;
        disappearStoryboard.Begin();
    }

    private void disappearStoryboard_Completed(object sender, object e)
    {
        if (replaceButtonClicked)
        {
            image1.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM200.png",
         UriKind.RelativeOrAbsolute));
            image2.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM201.png",
              UriKind.RelativeOrAbsolute));
            image3.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM202.png",
              UriKind.RelativeOrAbsolute));
            image4.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM203.png",
              UriKind.RelativeOrAbsolute));
            image5.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM210.png",
              UriKind.RelativeOrAbsolute));
            image6.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM211.png",
              UriKind.RelativeOrAbsolute));
            image7.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM212.png",
              UriKind.RelativeOrAbsolute));
            image8.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM213.png",
              UriKind.RelativeOrAbsolute));
            image9.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM220.png",
              UriKind.RelativeOrAbsolute));
            image10.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM221.png",
              UriKind.RelativeOrAbsolute));
            image11.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM222.png",
              UriKind.RelativeOrAbsolute));
            image12.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM223.png",
              UriKind.RelativeOrAbsolute));
            replaceButtonClicked = false;
        }
        if (replaceCustomButtonClicked)
        {
            image1.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom200.png",
         UriKind.RelativeOrAbsolute));
            image2.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom201.png",
              UriKind.RelativeOrAbsolute));
            image3.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom202.png",
              UriKind.RelativeOrAbsolute));
            image4.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom203.png",
              UriKind.RelativeOrAbsolute));
            image5.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom210.png",
              UriKind.RelativeOrAbsolute));
            image6.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom211.png",
              UriKind.RelativeOrAbsolute));
            image7.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom212.png",
              UriKind.RelativeOrAbsolute));
            image8.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom213.png",
              UriKind.RelativeOrAbsolute));
            image9.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom220.png",
              UriKind.RelativeOrAbsolute));
            image10.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom221.png",
              UriKind.RelativeOrAbsolute));
            image11.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom222.png",
              UriKind.RelativeOrAbsolute));
            image12.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom223.png",
              UriKind.RelativeOrAbsolute));
            replaceCustomButtonClicked = false;
        }
        if (replaceTileButtonClicked)
        {
            image1.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM300.png",
         UriKind.RelativeOrAbsolute));
            image2.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM301.png",
              UriKind.RelativeOrAbsolute));
            image3.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM302.png",
              UriKind.RelativeOrAbsolute));
            image4.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM303.png",
              UriKind.RelativeOrAbsolute));
            image5.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM304.png",
              UriKind.RelativeOrAbsolute));
            image6.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM305.png",
              UriKind.RelativeOrAbsolute));
            image7.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM306.png",
              UriKind.RelativeOrAbsolute));
            image8.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM301.png",
              UriKind.RelativeOrAbsolute));
            image9.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM302.png",
              UriKind.RelativeOrAbsolute));
            image10.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM303.png",
              UriKind.RelativeOrAbsolute));
            image11.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM310.png",
              UriKind.RelativeOrAbsolute));
            image12.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM311.png",
              UriKind.RelativeOrAbsolute));
            replaceTileButtonClicked = false;
        }
        displayStoryboard.Begin();
    }

}

MainPage.xaml.cs:我更改了
消失情节提要
消失情节提要(u
事件处理程序)中的图像资源

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }
    bool replaceButtonClicked, replaceCustomButtonClicked, replaceTileButtonClicked;

    private void replace_Click(object sender, RoutedEventArgs e)
    {
        replaceButtonClicked = true;
        disappearStoryboard.Begin();
    }

    private void replaceCustom_Click(object sender, RoutedEventArgs e)
    {
        replaceCustomButtonClicked = true;
        disappearStoryboard.Begin();
    }

    private void replaceTile_Click(object sender, RoutedEventArgs e)
    {
        replaceTileButtonClicked = true;
        disappearStoryboard.Begin();
    }

    private void disappearStoryboard_Completed(object sender, object e)
    {
        if (replaceButtonClicked)
        {
            image1.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM200.png",
         UriKind.RelativeOrAbsolute));
            image2.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM201.png",
              UriKind.RelativeOrAbsolute));
            image3.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM202.png",
              UriKind.RelativeOrAbsolute));
            image4.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM203.png",
              UriKind.RelativeOrAbsolute));
            image5.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM210.png",
              UriKind.RelativeOrAbsolute));
            image6.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM211.png",
              UriKind.RelativeOrAbsolute));
            image7.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM212.png",
              UriKind.RelativeOrAbsolute));
            image8.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM213.png",
              UriKind.RelativeOrAbsolute));
            image9.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM220.png",
              UriKind.RelativeOrAbsolute));
            image10.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM221.png",
              UriKind.RelativeOrAbsolute));
            image11.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM222.png",
              UriKind.RelativeOrAbsolute));
            image12.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM223.png",
              UriKind.RelativeOrAbsolute));
            replaceButtonClicked = false;
        }
        if (replaceCustomButtonClicked)
        {
            image1.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom200.png",
         UriKind.RelativeOrAbsolute));
            image2.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom201.png",
              UriKind.RelativeOrAbsolute));
            image3.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom202.png",
              UriKind.RelativeOrAbsolute));
            image4.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom203.png",
              UriKind.RelativeOrAbsolute));
            image5.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom210.png",
              UriKind.RelativeOrAbsolute));
            image6.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom211.png",
              UriKind.RelativeOrAbsolute));
            image7.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom212.png",
              UriKind.RelativeOrAbsolute));
            image8.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom213.png",
              UriKind.RelativeOrAbsolute));
            image9.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom220.png",
              UriKind.RelativeOrAbsolute));
            image10.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom221.png",
              UriKind.RelativeOrAbsolute));
            image11.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom222.png",
              UriKind.RelativeOrAbsolute));
            image12.Source = new BitmapImage(new Uri("ms-appx:///Assets/custom223.png",
              UriKind.RelativeOrAbsolute));
            replaceCustomButtonClicked = false;
        }
        if (replaceTileButtonClicked)
        {
            image1.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM300.png",
         UriKind.RelativeOrAbsolute));
            image2.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM301.png",
              UriKind.RelativeOrAbsolute));
            image3.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM302.png",
              UriKind.RelativeOrAbsolute));
            image4.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM303.png",
              UriKind.RelativeOrAbsolute));
            image5.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM304.png",
              UriKind.RelativeOrAbsolute));
            image6.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM305.png",
              UriKind.RelativeOrAbsolute));
            image7.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM306.png",
              UriKind.RelativeOrAbsolute));
            image8.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM301.png",
              UriKind.RelativeOrAbsolute));
            image9.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM302.png",
              UriKind.RelativeOrAbsolute));
            image10.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM303.png",
              UriKind.RelativeOrAbsolute));
            image11.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM310.png",
              UriKind.RelativeOrAbsolute));
            image12.Source = new BitmapImage(new Uri("ms-appx:///Assets/OSM311.png",
              UriKind.RelativeOrAbsolute));
            replaceTileButtonClicked = false;
        }
        displayStoryboard.Begin();
    }

}

为什么要这样做,而不是将多个图像元素放在一个网格中?在我的例子中,我想根据收缩级别(缩放级别)添加和删除图像。如果我直接使用图像控制,我会在添加和删除图像时获得闪烁效果。这就是为什么我想将多个图像合并为一个,将多个网格放在彼此的顶部。那你看了吗?它平滑地混合了缩放级别的图层。无法在该链接中运行示例,但您不知道为什么?到底是什么不起作用?