And*_*ock 1 .net c# wpf canvas
我正在将WPF画布渲染到图像并将其粘贴到剪贴板上.
如果画布很小(<900px square),它一切正常.
我有一个更大的画布(3000 + px square),剪贴板是空的(在photoshop/word等中禁用粘贴选项)
var transform = canvas.LayoutTransform;
canvas.LayoutTransform = null;
var size = new Size(canvas.Width, canvas.Height);
canvas.Measure(size);
canvas.Arrange(new Rect(size));
var renderBitmap = new RenderTargetBitmap((int) size.Width, (int) size.Height, 96d, 96d, PixelFormats.Pbgra32);
renderBitmap.Render(canvas);
canvas.LayoutTransform = transform;
Clipboard.SetImage(renderBitmap);
Run Code Online (Sandbox Code Playgroud)
我没有发现是否有一个阈值大小导致这个中断.
3140 x 1903不起作用,3140 x 317
这是怎么回事?
谢谢
事实证明,为了将图像存储到剪贴板,图像会自动转换为多种格式的未压缩位图(BMP,DIB等).因此,当你有一个10MP图像需要40MB无压缩(8位RGBA)时,它可能需要200MB的内存才能存储在剪贴板上 - 以防万一有人可能想要其他格式之一.
你可能能做的就是自己把它放在剪贴板上而不需要太多的开销.如果你使用Reflector,你会看到Clipboard.SetImage看起来像这样:
public static void SetImage(Image image)
{
if (image == null)
{
throw new ArgumentNullException("image");
}
IDataObject data = new DataObject();
data.SetData(DataFormats.Bitmap, true, image); // true means autoconvert
Clipboard.SetDataObject(data, true); // true means copy
}
Run Code Online (Sandbox Code Playgroud)
如果你创建自己的SetImage函数版本,其中一个或两个true实例都设置为false,你可以克服一些不必要的复制,并能够在剪贴板上放置一个更大的图像.
| 归档时间: |
|
| 查看次数: |
2760 次 |
| 最近记录: |