我正在ASP.Net中尝试实现以下功能:
对于其他WPF UI元素,这完全没有问题。 对于Image,使用BitmapImage.StreamSource属性设置源是有效的。 当我使用 BitmapImage.UriSource 属性时,BitmapImage.DownloadCompleted事件没有被触发,这表明该图片根本没有开始下载。
需要注意的是,对于大多数控件(椭圆、矩形、墨迹演示文稿以及Image控件),只要我使用流源而不是uri源,就可以正常工作。
所以,我错过了什么?为什么BitmapImage类在Web应用程序中行为不同?
我知道我会被问到这个目的,因为我编写了一个Silverlight客户端来创建存储在Web服务器上的图形内容。 我希望Web服务器将内容呈现为位图文件。
提前感谢您的任何建议。
这是我ASP.Net页面的代码:
- 创建一个WPF Canvas控件
- 启动一个WPF Image控件和BitmapImage对象
- 将BitmapImage源设置为图像的Uri
- 将图像添加到画布中
- 当图像下载完成后,将画布渲染到新的位图上
对于其他WPF UI元素,这完全没有问题。 对于Image,使用BitmapImage.StreamSource属性设置源是有效的。 当我使用 BitmapImage.UriSource 属性时,BitmapImage.DownloadCompleted事件没有被触发,这表明该图片根本没有开始下载。
需要注意的是,对于大多数控件(椭圆、矩形、墨迹演示文稿以及Image控件),只要我使用流源而不是uri源,就可以正常工作。
所以,我错过了什么?为什么BitmapImage类在Web应用程序中行为不同?
我知道我会被问到这个目的,因为我编写了一个Silverlight客户端来创建存储在Web服务器上的图形内容。 我希望Web服务器将内容呈现为位图文件。
提前感谢您的任何建议。
这是我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);
}
}