我已经发布了几个与我遇到的这个问题有关的问题,我开始相信这是无法做到的.这是背景故事.
我有一个ASP.NET应用程序,我想从中生成一个.png图像.此.png图像需要从XAML或WPF Visual Tree构建.因此,我必须在STA线程中生成.png图像.一切正常,直到我的XAML/WPF Visual Tree包含一个Image(如在System.Windows.Controls.Image中).我的.png文件生成正确,除了Image元素没有显示引用的图片.引用的图片位于远程URL.不会抛出任何错误或异常.
如何从包含System.Windows.Controls.Image元素的某些XAML/WPF Visual Tree创建.png图像?生成的.png必须包含Image元素中引用的图片.我以各种方式尝试了以下代码:
string address = "http://imgtops.sourceforge.net/bakeoff/o-png24.png"; WebClient webClient = new WebClient(); byte[] imageContent = webClient.DownloadData(address); Image image = new Image(); using (MemoryStream memoryStream = new MemoryStream(imageContent)) { BitmapImage imageSource = new BitmapImage(); imageSource.BeginInit(); imageSource.StreamSource = memoryStream; imageSource.EndInit(); image.Source = imageSource; } // Set the size image.Height = 200; image.Width = 300; // Position the Image within a Canvas image.SetValue(Canvas.TopProperty, 1.0); image.SetValue(Canvas.LeftProperty, 1.0); Canvas canvas = new Canvas(); canvas.Height = 200; canvas.Width = 300; canvas.Background = new SolidColorBrush(Colors.Purple); canvas.Children.Add(image); // Create the area Size availableSize = new Size(300, 200); frameworkElement.Measure(availableSize); frameworkElement.Arrange(new Rect(availableSize)); // Convert the WPF representation to a PNG file BitmapSource bitmap = RenderToBitmap(frameworkElement); PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); // Generate the .png FileStream fileStream = new FileStream(filename, FileMode.Create); encoder.Save(fileStream); public BitmapSource RenderToBitmap(FrameworkElement target) { int actualWidth = 300; int actualHeight = 200; Rect boundary = VisualTreeHelper.GetDescendantBounds(target); RenderTargetBitmap renderBitmap = new RenderTargetBitmap(actualWidth, actualHeight, 96, 96, PixelFormats.Pbgra32); DrawingVisual drawingVisual = new DrawingVisual(); using (DrawingContext context = drawingVisual.RenderOpen()) { VisualBrush visualBrush = new VisualBrush(target); context.DrawRectangle(visualBrush, null, new Rect(new Point(), boundary.Size)); } renderBitmap.Render(drawingVisual); return renderBitmap; }
谢谢您的帮助.
你正确地渲染输出位图,它只是你搞砸的输入位图:).
BitmapImage需要访问StreamSource属性,直到它触发DownloadCompleted事件,但是Dispose()
在它有机会之前"MemoryStream "的"使用"块!您可以简单地从使用块中解开MemoryStream并让GC处理它(如果这样做,我建议将BitmapImage.CacheOption设置为BitmapCacheOption.None,因此它直接使用流而不是副本),但我会使用UriSource属性并在呈现之前等待DownloadComplete事件.