2013-03-05 29 views
5

Tôi muốn xuất hình ảnh của đối tượng bản đồ ArcGIS của mình bằng lớp đồ họa trên đó. Tôi đã thử các dịch vụ web của riêng esri để xuất nhưng chúng không hiệu quả và rõ ràng, không hỗ trợ các hình dạng hình học phức tạp, chúng cũng không hỗ trợ các lớp địa phương như nhà cung cấp bản đồ Google. Dịch vụ chỉ hỗ trợ ArcGISTiledLayer tôi muốn nó trong tất cả các lớp. Vì vậy, tôi đã tìm kiếm trong diễn đàn của họ nhưng họ nói rằng họ sẽ không hỗ trợ các lớp địa phương cho đến các phiên bản tiếp theo.Có cách nào để tải Phần tử giao diện người dùng Silverlight dưới dạng hình ảnh không?

Tôi đã thử thư viện ImageTool và thư viện WritableBitmapEx trong bảng mã. Nhưng khi tôi cố gắng để có được byte [] từ một WritableBitmap tôi không thể truy cập tài sản Pixels của nó vì một số lý do an ninh tất cả các thời gian. Ứng dụng sẽ ném ra một SecurityException và nói rằng 'bạn không thể truy cập thuộc tính pixel này'.

Vì vậy, có cách nào để có được hình ảnh của điều khiển UIElement và lưu nó vào đĩa không? Hoặc là có một cách giải quyết cho ngoại lệ bảo mật này?

Trả lời

5

Có thư viện các công cụ hình ảnh có một phương pháp để làm điều này vào png/jpg, vv

http://imagetools.codeplex.com/

Ngoài ra bạn có thể sử dụng RenderTargetBitmap - http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.aspx

Dưới đây là một ví dụ về cách tiết kiệm tập tin vào đĩa. bạn chỉ có thể làm điều đó từ một hộp thoại

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

EDIT - Mẫu Mã

Calling

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

var bytData = objImage.ToPng(); 

Phương pháp mở rộng

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

Tôi có một số mã để sử dụng imagetools để tiết kiệm một png cố gắng để tìm nó :) – Dreamwalker

+0

Tôi đã thử thư viện công cụ hình ảnh với phương thức WriteToStream, nó không hoạt động. Tôi sẽ thử lớp RenderTargetBitmap. –

+0

Lưu vào đĩa phải được thực hiện với SaveFileDialog nếu không bạn sẽ nhận được một ngoại lệ gấu mà trong tâm trí. Vẫn đang tìm mã imagetools – Dreamwalker