gpt4 book ai didi

c# - 为什么 WPF BitmapImage 对象不从 ASP.Net Web 窗体中的 Uri 源下载图像?

转载 作者:行者123 更新时间:2023-11-30 16:36:42 24 4
gpt4 key购买 nike

我正在尝试在 ASP.Net 中完成以下操作:

  1. 创建 WPF Canvas 控件
  2. 启动一个 WPF Image 控件和一个 BitmapImage 对象
  3. 将 BitmapImage 源设置为图像的 Uri
  4. 将图像添加到 Canvas
  5. 下载图像后将 Canvas 渲染为新的位图

我的代码在 WPF 本身中运行正常,但是在 ASP.Net 页面中运行时,图像未下载。

它适用于其他 WPF UI 元素。对于 Image,使用 BitmapImage.StreamSource 属性设置源可以正常工作。当我使用 BitmapImage.UriSource 属性时,不会引发 BitmapImage.DownloadCompleted 事件,这暗示图像从一开始就不会开始下载。

重要的是要注意,只要我使用流源而不是 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);
}
}

最佳答案

我认为永远不会引发 DownloadCompleted 事件,因为当您使用允许后台线程(DownloadAndSave 方法)在加载图像之前完成的 UriSource 属性时,BitmapImage 会异步加载。

最近在几乎相同的情况下对我有用的是同步下载位图资源并使用 BitmapImage.StreamSource 属性设置它。请注意,在使用该技术时,在渲染 RenderTargetBitmap 之前不能关闭/处置流。

关于c# - 为什么 WPF BitmapImage 对象不从 ASP.Net Web 窗体中的 Uri 源下载图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/530450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com