【问题标题】:Xamarin Forms - Image To/From IRandomAccessStreamReferenceXamarin 表单 - 图像到/来自 IRandomAccessStreamReference
【发布时间】:2017-01-29 20:08:42
【问题描述】:

出于个人需要,对于Xamarin.Forms.Map控件,我需要创建一个CustomPin扩展。 UWP 部分(PCL 项目)

我创建了一个MapIcon 喜欢它:

nativeMap.MapElements.Add(new MapIcon()
{
    Title = pin.Name,
    Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/Pin/customicon.png")),
    Location = new Geopoint(new BasicGeoposition() { Latitude = pin.Position.Latitude, Longitude = pin.Position.Longitude }),
    NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 1.0)
});

但是,通过这种方式,我无法设置Image 的大小。

然后我想使用我的 PCL 部分中的 Image,调整它的大小并将其转换为 IRandomAccessStreamReference。为了实现它,我需要将我的Image 转换为流,但我找不到让它工作的方法>

所需函数示例:

private IRandomAccessStreamReference ImageToIRandomAccessStreamReference(Image image)
{
    //Here I can set the size of my Image

    //I convert it into a stream
    IRandomAccessStreamReference irasr = RandomAccessStreamReference.CreateFromStream(/* img? */);

    //irasr is then created from img

    //I return the IRandomAccessStreamReference needed by the MapIcon element
    return irasr;
}

注意:Image 参数 imgXamarin.Forms.Image

首先,这可能吗?如果是的话,那么感谢任何可以帮助我的帮助。我已经搜索了如何调整 MapIcon 的大小,但无法直接从类 [MapIcon] 中进行调整。(https://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.maps.mapicon.aspx)

感谢您的帮助!

【问题讨论】:

    标签: xamarin.forms uwp bing-maps marker uwp-maps


    【解决方案1】:

    你是对的。我们无法直接调整MapIcon 的大小,因为它不提供此类属性或方法。 MapIcon 的大小主要由MapIcon.Image 属性设置的图像大小控制。我们可以在不使用 Xamarin.Forms.Image 的情况下设置此图像的大小。

    要设置此图像的大小,我们可以利用BitmapDecoder classBitmapEncoder classBitmapTransform class,如下所示:

    private async System.Threading.Tasks.Task<RandomAccessStreamReference> ResizeImage(StorageFile imageFile, uint scaledWidth, uint scaledHeight)
    {
        using (IRandomAccessStream fileStream = await imageFile.OpenAsync(FileAccessMode.Read))
        {
            var decoder = await BitmapDecoder.CreateAsync(fileStream);
    
            //create a RandomAccessStream as output stream
            var memStream = new InMemoryRandomAccessStream();
    
            //creates a new BitmapEncoder and initializes it using data from an existing BitmapDecoder
            BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(memStream, decoder);
    
            //resize the image
            encoder.BitmapTransform.ScaledWidth = scaledWidth;
            encoder.BitmapTransform.ScaledHeight = scaledHeight;
    
            //commits and flushes all of the image data
            await encoder.FlushAsync();
    
            //return the output stream as RandomAccessStreamReference
            return RandomAccessStreamReference.CreateFromStream(memStream);
        }
    }
    

    然后我们可以使用这个方法先创建一个resized的图片流引用,然后设置为MapIconImagelike:

    var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Pin/customicon.png"));
    var imageReference = await ResizeImage(file, 64, 64);
    
    nativeMap.MapElements.Add(new MapIcon()
    {
        Title = pin.Name,
        Image = imageReference,
        Location = new Geopoint(new BasicGeoposition() { Latitude = pin.Position.Latitude, Longitude = pin.Position.Longitude }),
        NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 1.0)
    });
    

    【讨论】:

    • 嗨!天哪,我找了这么久!今晚我试试,谢谢! :)
    • @Emixam23 嗨,有更新吗?如果我的回答没有解决您的问题,请随时告诉我。
    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多