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)
});