2016-09-21 7 views
2

Для личных нужд, для Xamarin.Forms.Map управления, мне нужно создать расширение CustomPin. UWP часть (проект PCL)Xamarin Forms - Image To/From IRandomAccessStreamReference

я создаю 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 «s.

Затем я хочу использовать 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; 
} 

Примечание: В ImageIMG параметра Я является Xamarin.Forms.Image

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

Благодарим за помощь!

ответ

3

Вы правы. Мы не можем изменять размер MapIcon напрямую, так как он не предоставляет таких свойств или методов. Размер MapIcon в основном контролируется размером изображения, которое задано MapIcon.Image. И мы можем установить размер этого изображения без использования Xamarin.Forms.Image.

Чтобы установить размер Это изображение, мы можем воспользоваться BitmapDecoder class, BitmapEncoder class и BitmapTransform 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); 
    } 
} 

И тогда мы можем использовать этот метод, чтобы создать уменьшенную ссылку потока изображения первой и затем установить его в качестве 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) 
}); 
+0

Привет! Боже, я так долго ищу! Я попробую сегодня вечером, спасибо! :) – Emixam23

+0

@ Emixam23 Привет, любое обновление? Если мой ответ не решит вашу проблему, пожалуйста, сообщите мне об этом. –

+0

Он отлично работает, спасибо :) – Emixam23

 Смежные вопросы

  • Нет связанных вопросов^_^