Xamarin Forms - изображение в / из IRandomAccessStreamReference

Для личных нужд, для элемента управления 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 размер.

Затем я хочу использовать Image из моей части PCL, измените размер и преобразуйте его в 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 Параметр IMG является Xamarin.Forms.Image

Итак, во-первых, возможно ли это?Если да, то спасибо за любую помощь, которая может мне помочь. Я уже ищу способы изменения размера MapIcon, и это невозможно напрямую из класса [MapIcon]. ( https://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.maps.mapicon.aspx)

Спасибо за помощь!

1 ответ

Решение

Вы правы. Мы не можем изменить размеры 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);
    }
}

И затем мы можем использовать этот метод, чтобы сначала создать ссылку на поток изображения с измененным размером, а затем установить его как MapIcon"s Image лайк:

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)
});
Другие вопросы по тегам