Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine if file copied into clipboard is an image

Tags:

c#

.net

The user right clicks on a file(say on the desktop) and clicks 'copy' . Now how do I determine in C# if the file copied to the clipboard is an image type ?

Clipboard.ContainsImage() doesn't work in this case

The following determines if an image is directly copied to the clipboard, not if a file is copied to the clipboard

   IDataObject d = Clipboard.GetDataObject();

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

To be clear I want to determine if the 'file' copied to the clipboard is an image.

Edit: the answers are great, but how do I get the filename of a file copied to the clipboard ? Clipboard.getText() doesn't seem to work.. Edit2: Clipboard.GetFileDropList() works

like image 821
gyaani_guy Avatar asked Jan 23 '11 16:01

gyaani_guy


2 Answers

You can check it like this (There is no built in way of doing this) Read the file and use it in a Graphics Image Object if it will be image it will work fine else it will Raise an OutOfMemoryException.

here is a sample code:

 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;
  }

It will work for BMP, GIF, JPEG, PNG, TIFF file formats


Update

Here is the code to get the FileName:

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
    }
}
like image 152
Shekhar_Pro Avatar answered Oct 30 '22 15:10

Shekhar_Pro


Get the filename(s) from the clipboard(copying a file to the clip-board just copies its name). Then check if file(s) are image(s).

There are two ways to do that:

  1. By file extension
  2. Open the file and check for magic-bytes indicating the common image formats

I prefer the second one because it works even if a file has the wrong extension. On slow media it might be slower though since you need to access the file instead of just working the filename which you got from the clipboard.

like image 3
CodesInChaos Avatar answered Oct 30 '22 15:10

CodesInChaos