确定复制到剪贴板中的文件是否为图像

7

用户右键单击文件(例如在桌面上),然后点击“复制”。现在我该如何在C#中确定剪贴板中复制的文件是否为图像类型?

在这种情况下,Clipboard.ContainsImage()不起作用。

以下代码可以确定是否直接复制了图像到剪贴板,而不是文件:

   IDataObject d = Clipboard.GetDataObject();

   if(d.GetDataPresent(DataFormats.Bitmap))
   {
       MessageBox.Show("image file found");
   }

明确一点,我想确定复制到剪贴板的“文件”是否为图像。

编辑:答案很好,但是如何获取复制到剪贴板的文件的文件名?Clipboard.getText()似乎不起作用.. 编辑2:Clipboard.GetFileDropList()可以使用


1
在许多情况下,检查文件扩展名就足够了。但是你可以同时使用“Magic-Bytes”方法(如CodeInChaos所说)和“异常处理”方法(如Shekhar_Pro所说)。此外还有一个工具叫做“TrID”,它是一个免费的命令行实用程序,可以使用签名数据库来确定文件类型。http://mark0.net/soft-trid-e.html - fardjad
3个回答

7
您可以像这样检查它(没有内置的方法可供使用)读取文件并在图形图像对象中使用它,如果是图像,则可以正常工作,否则将引发OutOfMemoryException
以下是示例代码:
 bool IsAnImage(string filename)
  {
   try
    {
        Image newImage = Image.FromFile(filename);
    }
    catch (OutOfMemoryException ex)
    {
        // Image.FromFile will throw this if file is invalid.
       return false;
    }
    return true;
  }

它可以处理BMP、GIF、JPEG、PNG、TIFF文件格式。


更新

以下是获取文件名的代码:

IDataObject d = Clipboard.GetDataObject();
if(d.GetDataPresent(DataFormats.FileDrop))
{
    //This line gets all the file paths that were selected in explorer
    string[] files = d.GetData(DataFormats.FileDrop);
    //Get the name of the file. This line only gets the first file name if many file were selected in explorer
    string TheImageFile = files[0];
    //Use above method to check if file is Image file
    if(IsAnImage(TheImageFile))
    {
         //Process file if is an image
    }
    {
         //Process file if not an image
    }
}

这个程序运行良好,但是我无法获取复制到剪贴板的文件名。有什么想法如何获取它? - gyaani_guy
你需要将DataFormats.FileDrop强制转换为字符串数组吗? string[] files = (string[]) d.GetData(DataFormats.FileDrop); - Georg

3
从剪贴板中获取文件名(将文件复制到剪贴板中只会复制其名称)。然后检查文件是否为图像。
有两种方法可以做到这一点:
1.通过文件扩展名 2.打开文件并检查指示常见图像格式的魔术字节
我更喜欢第二种方法,因为它即使文件具有错误的扩展名也能正常工作。但在慢速媒体上可能会更慢,因为您需要访问文件而不仅仅是使用从剪贴板获取的文件名。

谢谢你指引我正确的方向。通过文件扩展名似乎在这里不起作用。我将不得不弄清楚魔术字节的事情。 - gyaani_guy

0

您可以轻松地检查剪贴板是否包含图像:

if (Clipboard.ContainsImage())
{
    MessageBox.Show("Yes this is an image.");
}
else
{
    MessageBox.Show("No this is not an image!");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接