C# 从剪贴板复制增强型图元文件并将其另存为图像
我正在使用下面的C代码从剪贴板复制图像C# 从剪贴板复制增强型图元文件并将其另存为图像,c#,image,clipboard,C#,Image,Clipboard,我正在使用下面的C代码从剪贴板复制图像 if (Clipboard.ContainsData(System.Windows.DataFormats.EnhancedMetafile)) { /* taken from http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/a5cebe0d-eee4-4a91-88e4-88eca9974a5c/excel-copypicture-and-asve-to-enhanced-
if (Clipboard.ContainsData(System.Windows.DataFormats.EnhancedMetafile))
{
/* taken from http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/a5cebe0d-eee4-4a91-88e4-88eca9974a5c/excel-copypicture-and-asve-to-enhanced-metafile*/
var img = (System.Windows.Interop.InteropBitmap)Clipboard.GetImage();
var bit = Clipboard.GetImage();
var enc = new System.Windows.Media.Imaging.JpegBitmapEncoder();
var stream = new FileStream(fileName + ".bmp", FileMode.Create);
enc.Frames.Add(BitmapFrame.Create(bit));
enc.Save(stream);
}
我把这段话从我的字典里取了下来。控件确实处于if状态Clipboard.GetImage()
返回空值。有人能告诉我这里出了什么问题吗
我还尝试了以下代码片段
Metafile metafile = Clipboard.GetData(System.Windows.DataFormats.EnhancedMetafile) as Metafile;
Control control = new Control();
Graphics grfx = control.CreateGraphics();
MemoryStream ms = new MemoryStream();
IntPtr ipHdc = grfx.GetHdc();
grfx.ReleaseHdc(ipHdc);
grfx.Dispose();
grfx = Graphics.FromImage(metafile);
grfx.Dispose();
这也不起作用。以下代码将起作用。如果需要,可以更改保存的图像的格式
if (Clipboard.ContainsImage())
{
Image image = Clipboard.GetImage();
image.Save(@"c:\temp\image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
您可以通过p/invoke使用
user32.dll
,如下所示:
public const uint CF_METAFILEPICT = 3;
public const uint CF_ENHMETAFILE = 14;
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool CloseClipboard();
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetClipboardData(uint format);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool IsClipboardFormatAvailable(uint format);
现在,您可以读取图元文件:
Metafile emf = null;
if (OpenClipboard(IntPtr.Zero))
{
if (IsClipboardFormatAvailable(CF_ENHMETAFILE))
{
var ptr = GetClipboardData(CF_ENHMETAFILE);
if (!ptr.Equals(IntPtr.Zero))
emf = new Metafile(ptr, true);
}
// You must close ir, or it will be locked
CloseClipboard();
}
我最初的需求涉及对该图元文件的更多处理,因此我创建了一个MemoryStream
:
using (var graphics = Graphics.FromImage(new Bitmap(1,1,PixelFormat.Format32bppArgb)))
{
var hdc = graphics.GetHdc();
using (var original = new MemoryStream())
{
using (var dummy = Graphics.FromImage(new Metafile(original, hdc)))
{
dummy.DrawImage(emf, 0, 0, emf.Width, emf.Height);
dummy.Flush();
}
graphics.ReleaseHdc(hdc);
// do more stuff
}
}
也许可以帮助一些人,这里还有一个方法来保存图元文件到位图