从 URL 创建 ImageBrush、Bitmap 和 WriteableBitmap

7

嗨,我有一个使用 Silverlight API 的 Windows Phone 8.1 应用程序。

我正在从我的 Blob 存储中下载这个图像。

要下载的图片

该图像来自于这样的链接:https://[service].blob.core.windows.net/[imagename].png,并且可以在多个浏览器中显示和下载,只需使用 URI。

现在,我想根据 Blob 存储中的 ImageURI 使用它作为 ImageBrush。

// If we have a returned SAS.
                BitmapImage myOnlineImage = new BitmapImage();
                myOnlineImage.UriSource = new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute);
                //ImageOnlineTest.Source = myOnlineImage;
                var imageBrush = new ImageBrush
                {
                    ImageSource = myOnlineImage,
                    Stretch = Stretch.None
                };
                var source = FindChildShieldCanvas(CanvasImage, imageBrush);

                WriteableBitmap wbm = new WriteableBitmap((BitmapImage)myOnlineImage);
                ImageOnlineTest.Source = wbm;
myOnlineImage没有正确创建,至少我无法将图像转换为可写的位图图像(从转换中获取空异常),而且图像刷为空,即null。但据我所知,这是正确的方法?基本上,如何基于https站点的url创建imagebrush
3个回答

4
我最终自己解决了这个问题:
记得添加 using System.Runtime.InteropServices.WindowsRuntime;
// If we have a returned SAS.
                BitmapImage myOnlineImage = new BitmapImage();

                //myOnlineImage.UriSource = new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute);
                using (var webCLient = new Windows.Web.Http.HttpClient())
                {
                    webCLient.DefaultRequestHeaders.Add("User-Agent", "bot");
                    var responseStream = await webCLient.GetBufferAsync(new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute));
                    var memoryStream = new MemoryStream();//responseStream.ToArrayAsStream().ReadAsync());

                    memoryStream.Write(responseStream.ToArray(), 0, responseStream.ToArray().Length);
                    memoryStream.Position = 0;
                    myOnlineImage.SetSource(memoryStream);

                }
                //ImageOnlineTest.Source = myOnlineImage;
                var imageBrush = new ImageBrush
                {
                    ImageSource = myOnlineImage,
                    Stretch = Stretch.None
                };
                var source = FindChildShieldCanvas(CanvasImage, imageBrush);

                WriteableBitmap wbm = new WriteableBitmap((BitmapImage)myOnlineImage);

这段代码适用于imagebrush和writeablebitmap。


3
从图像创建位图,您必须在设置URL之前开始初始化位图对象。
    BitmapImage myOnlineImage = new BitmapImage();
    myOnlineImage.BeginInit();
    myOnlineImage.UriSource = new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute);
    myOnlineImage.EndInit();

    var imageBrush = new ImageBrush
    {
        ImageSource = myOnlineImage,
        Stretch = Stretch.None
    };
    var source = FindChildShieldCanvas(CanvasImage, imageBrush);

    WriteableBitmap wbm = new WriteableBitmap((BitmapImage)myOnlineImage);
    ImageOnlineTest.Source = wbm;

感谢您的输入。似乎在Windows Phone 8.1 Silverlight上不支持使用BeginInitEndInit - JTIM
查看文档,它说“BitmapImage在引发ImageOpened事件之前不会准备好使用”。虽然看起来你已经成功切换到了SetSource方法。 - Brian from state farm
尝试了许多不同的方法,例如监听事件等,但似乎并没有正常工作 :/ - JTIM

1
以下是使用C#的方法,您可以用您的字段替换适当的代码。
Rectangle rectangle = new Rectangle();
rectangle.StrokeThickness = 10;
rectangle.Height = 200;
rectangle.Width = 100;
rectangle.SetValue(Canvas.LeftProperty, 100d);
rectangle.SetValue(Canvas.TopProperty, 100d);
rectangle.Fill = new ImageBrush(new BitmapImage(new Uri(@"C:\User\xiaorui.dong\Pictures\profile.jpeg")));

我在Star中尝试过,但没有成功。我的问题是这是在wp 8.1银光项目内完成还是其他项目类型? - JTIM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接