Есть ли способ получить элемент пользовательского интерфейса Silverlight в виде изображения?

Я хочу экспортировать изображение моего объекта карты ArcGIS с графическим слоем на нем. Я пробовал собственные веб-сервисы esri для экспорта, но они не такие эффективные и понятные, не поддерживают сложные геометрические формы, а также не поддерживают локальные слои, такие как поставщик карт Google. Сервис поддерживает только ArcGISTiledLayer, я хочу его во всех слоях. Итак, я искал на их форумах, но они говорят, что не будут поддерживать локальные слои до следующих версий.

Я пробовал библиотеки ImageTool и библиотеки WritableBitmapEx в codeplex. Но когда я пытаюсь получить byte[] из WritableBitmap, я все время не могу получить доступ к его свойству Pixels по некоторым соображениям безопасности. Приложение выдает исключение SecurityException и говорит, что «вы не можете получить доступ к этому свойству пикселей».

Итак, есть ли способ получить изображение элемента управления UIElement и сохранить его на диск? Или есть обходной путь для этого исключения безопасности?


person Cem Sönmez    schedule 05.03.2013    source источник


Ответы (1)


Да, в библиотеке инструментов для изображений есть способ сделать это в png/jpg и т. д.

http://imagetools.codeplex.com/

Также вы можете использовать RenderTargetBitmap — http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.rendertargetbitmap.aspx

Вот пример того, как сохранить файл на диск. вы можете сделать это только из диалога

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

ИЗМЕНИТЬ – Пример кода

Вызов

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

var bytData = objImage.ToPng();

Метод расширения

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;
}
person Dreamwalker    schedule 05.03.2013
comment
У меня есть код для использования imagetools, чтобы сохранить png, пытаясь найти его :) - person Dreamwalker; 05.03.2013
comment
я пробовал библиотеку инструментов изображения с методом WriteToStream, это не работает. Я попробую класс RenderTargetBitmap. - person Cem Sönmez; 05.03.2013
comment
Сохранение на диск должно выполняться с помощью SaveFileDialog, иначе вы получите исключение, имейте это в виду. Все еще ищу код imagetools - person Dreamwalker; 05.03.2013
comment
У меня нет проблем с сохранением файла на диск. Проблема в том, что я не могу получить массив байтов изображения. - person Cem Sönmez; 05.03.2013
comment
добавил образец для вас. вы, конечно, могли бы адаптировать это для записи в поток, вместо этого это использовалось в сервисном вызове в моем приложении. - person Dreamwalker; 05.03.2013
comment
Та же проблема в строке objPngEncoder.Encode(Image.ToImage(), objPngStream). Выдается исключение SecurityException и сообщается, что WriteableBitmap имеет защищенный контент. Доступ к пикселям запрещен. Я закодировал метод расширения ToByteArray() для WritableBitmap, и когда я пытаюсь получить доступ к его свойству Pixels, он выдает то же исключение. Я думаю, мы не можем получить доступ к этому свойству, возможно, мне следует найти другой способ :( - person Cem Sönmez; 05.03.2013
comment
У вас возникла проблема междоменной безопасности, поэтому вам было отказано в доступе к данным пикселей. Я не уверен, что в Silverlight есть способ обойти это. - person Dreamwalker; 05.03.2013