我有3D WPF视觉图像,我想传递给Excel单元格(通过剪贴板缓冲区)。
使用“正常” BMP图像,它可以工作,但我不知道如何转换RenderTargetBitmap。
我的代码如下所示:
System.Windows.Media.Imaging.RenderTargetBitmap renderTarget = myParent.GetViewPortAsImage(DiagramSizeX, DiagramSizeY);
System.Windows.Controls.Image myImage = new System.Windows.Controls.Image();
myImage.Source = renderTarget;
System.Drawing.Bitmap pg = new System.Drawing.Bitmap(DiagramSizeX, DiagramSizeY);
System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(pg);
gr.DrawImage(myImage, 0, 0);
System.Windows.Forms.Clipboard.SetDataObject(pg, true);
sheet.Paste(range);
Run Code Online (Sandbox Code Playgroud)
我的问题是gr.DrawImage不接受a System.Windows.Controls.Image或a System.Windows.Media.Imaging.RenderTargetBitmap;只有一个System.Drawing.Image。
如何将转换Controls.Image.Imaging.RenderTargetBitmap为Image,或者有没有更简单的方法?
我想在我的应用程序中创建一个Canvas区域的快照.我正在使用Visual Brush来获取快照并使用PngEncoder保存它.但是生成的PNG只是一个空白的黑色图像.我不确定问题是创建的BitmapSource还是PNGEncoder问题.这是我用来获取相同代码的代码.
public void ConvertToBitmapSource(UIElement element)
{
var target = new RenderTargetBitmap((int)(element.RenderSize.Width), (int)(element.RenderSize.Height), 96, 96, PixelFormats.Pbgra32);
var brush = new VisualBrush(element);
var visual = new DrawingVisual();
var drawingContext = visual.RenderOpen();
drawingContext.DrawRectangle(brush, null, new Rect(new Point(0, 0),
new Point(element.RenderSize.Width, element.RenderSize.Height)));
drawingContext.Close();
target.Render(visual);
PngBitmapEncoder encoder = new PngBitmapEncoder();
BitmapFrame outputFrame = BitmapFrame.Create(target);
encoder.Frames.Add(outputFrame);
using (FileStream file = File.OpenWrite("TestImage.png"))
{
encoder.Save(file);
}
}
Run Code Online (Sandbox Code Playgroud) 之后RenderTargetBitmap就太慢了。我尝试了一种不同的方法。不幸的是我的尝试没有成功。希望你们中的一些人能够弄清楚为什么这段代码不起作用。
var myPopup = new Popup();
var child = new Grid() { Background = new VisualBrush(myVisual)};
myPopup.StaysOpen = false;
myPopup.Child = child;
myPopup.IsOpen = false;
myPopup.Opened += (sender, args) =>
{
var source = ((HwndSource)PresentationSource.FromVisual(myPopup.Child));
var image = new Bitmap(1000,1000);
using (Graphics gr = Graphics.FromHwnd(source.Handle))
{
var ptr = gr.GetHdc();
using (Graphics g = Graphics.FromHdc(ptr))
{
g.DrawImage(image, new System.Drawing.Point(0, 0));
}
gr.ReleaseHdc(ptr);
}
//The image is just black...
image.Save("test.png");
myPopup.IsOpen = false;
};
myPopup.IsOpen = true;
Run Code Online (Sandbox Code Playgroud) 有没有替代RenderTargetBitmap可以生成一个与Image.Source一起使用的图像并且在.NET 3.5 sp1中是硬件加速的吗?.NET 4.0的答案很好,但我可能无法使用它们.
如果人们发现它会对我有帮助,那么他们应该为此投票.
我看到WinRT RenderTargetBitmap能够通过"RenderAsync(visual);"异步呈现Visual.方法.不幸的是.net RendertargetBitmap 没有RenderAsync方法..net RenderTargetBitmap是否有任何变通方法或扩展,以允许WPF视觉效果的异步呈现?提前感谢您的帮助!
wpf ×5
c# ×3
acceleration ×1
async-await ×1
asynchronous ×1
bitmapimage ×1
graphics ×1
hardware ×1
png ×1
render ×1
silverlight ×1
snapshot ×1