2013-03-05 24 views
5

Chcę wyeksportować obraz mojego obiektu mapy ArcGIS z warstwą graficzną na nim. Próbowałem usług internetowych esri na eksport, ale nie są one tak wydajne i jasne, nie obsługują skomplikowanych kształtów geometrycznych, a także nie obsługują warstw lokalnych, takich jak dostawca map Google. Usługa obsługuje tylko ArcGISTiledLayer chcę ją we wszystkich warstwach. Szukałem więc na ich forach, ale mówią, że nie będą obsługiwać warstw lokalnych do następnych wersji.Czy jest jakiś sposób na uzyskanie elementu Silverlight UI jako obrazu?

Próbowałem już bibliotek ImageTool i bibliotek WritableBitmapEx w codeplex. Ale kiedy próbuję uzyskać bajt [] z WritableBitmap, nie mogę uzyskać dostępu do jego właściwości Pixels z pewnych względów bezpieczeństwa przez cały czas. Aplikacja zgłasza wyjątek SecurityException i mówi, że "nie możesz uzyskać dostępu do tej właściwości pikseli".

Czy istnieje sposób uzyskania obrazu kontrolki UIElement i zapisania go na dysku? Czy istnieje obejście tego wyjątku zabezpieczeń?

Odpowiedz

5

Tak biblioteka narzędzi Obraz ma sposobu, aby to zrobić w png/jpg itp

http://imagetools.codeplex.com/

Również można użyć RenderTargetBitmap - http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.aspx

Oto przykład tego, jak zaoszczędzić plik na dysk. można tylko zrobić to z dialogowym

http://www.silverlightshow.net/items/Using-the-SaveFileDialog-in-Silverlight-3.aspx

EDIT - Kod Przykładowy

Wywołanie

var objImage = new WritableBitmap(MyElement, MyElement.RenderTransform); 

var bytData = objImage.ToPng(); 

metodę rozszerzenia

using ImageTools.IO.Png; 
using ImageTools; 

public static byte[] ToPng(this WriteableBitmap Image) 
{ 
    byte[] bytResult; 

    using (MemoryStream objPngStream = new MemoryStream()) 
    { 
     PngEncoder objPngEncoder = new PngEncoder(); 
     objPngEncoder.Encode(Image.ToImage(), objPngStream); 
     objPngStream.Seek(0, SeekOrigin.Begin); 
     bytResult = objPngStream.ToArray(); 
     objPngStream.Close(); 
    } 
    return bytResult; 
} 
+0

mam jakiś kod, aby użyć imagetools, aby zapisać png próbując go znaleźć :) – Dreamwalker

+0

Próbowałem wypróbować bibliotekę narzędzi obrazów za pomocą metody WriteToStream, to nie działa. Spróbuję klasy RenderTargetBitmap. –

+0

Zapisywanie na dysk musi odbywać się za pomocą SaveFileDialog, w przeciwnym razie otrzymasz wyjątek, o czym należy pamiętać. Nadal szukam kodu imagetools – Dreamwalker