Я пытаюсь сделать следующее в ASP.Net:
- Создание элемента управления WPF Canvas
- Раскрутите элемент управления WPF Image и объект BitmapImage
- Установите для источника BitmapImage значение Uri для изображения
- Добавить изображение на холст
- Когда изображение загружено, визуализируйте холст на новом растровом изображении
Мой код работает правильно в самом WPF, однако при запуске на странице ASP.Net изображение не загружается.
Он отлично работает для других элементов интерфейса WPF. В случае Image использование свойства BitmapImage.StreamSource для задания источника работает правильно. Когда я использую свойство BitmapImage.UriSource, событие BitmapImage.DownloadCompleted не возникает, что указывает на то, что изображение никогда не начинает загружаться в первую очередь.
Важно отметить, что он отлично работает для большинства элементов управления - эллипсов, прямоугольников, презентеров чернил, а также для элемента управления изображением, если я использую источник потока, а не источник URI.
Итак, что мне здесь не хватает? Почему класс BitmapImage ведет себя по-разному в сети
приложение?
Я знаю, что меня спросят, поэтому цель в том, чтобы я написал клиент Silverlight для создания графического контента, который хранится на веб-сервере. Я хочу, чтобы веб-сервер отображал содержимое в растровые файлы.
Заранее спасибо за любые советы.
Вот мой код для страницы ASP.Net:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Threading;
using System.Windows;
using System.Net;
using System.IO;
using System.Windows.Media;
public partial class _Default : System.Web.UI.Page
{
private static Canvas c;
protected void Page_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(
delegate { DownloadAndSave(); }));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
[STAThread]
void DownloadAndSave()
{
c = new Canvas();
BitmapImage bitmap = new BitmapImage();
System.Windows.Controls.Image image = new System.Windows.Controls.Image();
bitmap.DownloadCompleted += new EventHandler(bitmap_DownloadCompleted);
bitmap.BeginInit();
bitmap.UriSource = new Uri("http://andrew.myhre.tanash.net/customassets/andrewmyhre/image/face.jpg");
bitmap.EndInit();
image.Source = bitmap;
c.Children.Add(image);
c.UpdateLayout();
c.Measure(new Size(400, 300));
c.Arrange(new Rect(new Size(400, 300)));
}
void bitmap_DownloadCompleted(object sender, EventArgs e)
{
// this never fires!!
SaveImage(c);
}
void SaveImage(UIElement element)
{
RenderTargetBitmap bmp = new RenderTargetBitmap(400, 300, 96, 96, PixelFormats.Pbgra32);
bmp.Render(element);
BitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (Stream stm = File.Create(Server.MapPath("~/file.jpg")))
encoder.Save(stm);
}
}