C# Clipboard.SetImage with WPF canvas为大图像保留剪贴板空白
我正在将WPF画布渲染到图像并将其粘贴到剪贴板上 如果画布很小(<900px正方形),则一切正常 我有一个更大的画布(3000+px正方形),剪贴板是空的(在photoshop/word等中禁用粘贴选项) 我还没有发现是否有一个阈值大小,导致这一突破 3140x1903不起作用,3140x317起作用 发生什么事了C# Clipboard.SetImage with WPF canvas为大图像保留剪贴板空白,c#,.net,wpf,canvas,C#,.net,Wpf,Canvas,我正在将WPF画布渲染到图像并将其粘贴到剪贴板上 如果画布很小(
感谢事实证明,为了将图像存储到剪贴板,图像会自动转换为几种格式(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
}
如果将一个或两个
true
实例设置为false
,则您可以制作自己版本的SetImage函数,从而克服一些不必要的复制,并能够将较大的图像放在剪贴板上。事实证明,为了将图像存储到剪贴板,图像自动转换为多种格式(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
}
如果将一个或两个true
实例设置为false
,则您可以制作自己版本的SetImage函数,从而克服一些不必要的复制,并将较大的图像放在剪贴板上