Xamarin Forms - 图像转换为/从IRandomAccessStreamReference

3

针对个人需求,在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;
}

注意: 参数Imageimg是一个Xamarin.Forms.Image

首先,这是否可能?如果是,则感谢任何可以帮助我的帮助..我已经搜索如何调整MapIcon的大小,但不能直接从类[MapIcon]中实现。(https://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.maps.mapicon.aspx

感谢您的帮助!

1个回答

6
你说得对。我们不能直接调整MapIcon的大小,因为它没有提供这样的属性或方法。MapIcon的大小主要受到由MapIcon.Image属性设置的图像大小的控制。我们可以在不使用Xamarin.Forms.Image的情况下设置此图像的大小。
为了设置此图像的大小,我们可以利用BitmapDecoder类BitmapEncoder类BitmapTransform类,如下所示:
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);
    }
}

然后我们可以使用这种方法首先创建一个调整大小的图像流引用,然后将其设置为MapIconImage,如下所示:

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
@Emixam23 你好,有更新了吗?如果我的答案没有解决你的问题,请随时告诉我。 - Jay Zuo

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