2011-01-23 9 views
6

El usuario hace clic derecho en un archivo (por ejemplo, en el escritorio) y hace clic en "copiar". ¿Ahora cómo determino en C# si el archivo copiado al portapapeles es un tipo de imagen?Determine si el archivo copiado en el portapapeles es una imagen

Clipboard.ContainsImage() no funciona en este caso

A continuación se determina si una imagen se copia directamente en el portapapeles, no si un archivo se copia en el portapapeles

IDataObject d = Clipboard.GetDataObject(); 

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

Para ser claro Quiero determinar si el 'archivo' copiado al portapapeles es una imagen.

Editar: las respuestas son geniales, pero ¿cómo obtengo el nombre de archivo de un archivo copiado en el portapapeles? Clipboard.getText() no parece funcionar .. Edit2: Clipboard.GetFileDropList() funciona

+1

En muchos casos, la extensión del archivo de comprobación es suficiente. Sin embargo, ambos pueden usar el método 'Magic-Bytes' (como dijo CodeInChaos) y el método' Exception Handling' (como dijo Shekhar_Pro). También hay una herramienta llamada 'TrID' que es una utilidad gratuita de línea de comandos que se puede usar para determinar tipos de archivos usando una base de datos de firmas. http://mark0.net/soft-trid-e.html – fardjad

Respuesta

6

Puede verificarlo de esta manera (no hay una forma de hacerlo) Lea el archivo y úselo en un objeto de imagen de gráficos si va a ser una imagen, funcionará bien, de lo contrario aumentará un OutOfMemoryException.

aquí es un ejemplo de código:

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

Se trabajará para BMP, GIF, JPEG, PNG, formatos de archivo TIFF


Actualizar

Este es el código para obtener el Nombre de archivo :

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 
    } 
} 
+0

esto funciona bien, excepto que no puedo obtener el nombre de archivo del archivo copiado en el portapapeles. alguna idea de cómo obtener eso? –

+0

he actualizado mi código ... –

3

Obtenga los nombre (s) del portapapeles (copiando un archivo al portapapeles simplemente copia su nombre). Luego verifique si los archivos son imágenes.

Hay dos maneras de hacerlo:

  1. Por extensión de archivo
  2. Abrir el archivo y comprobar si hay magia-bytes que indica los formatos de imagen comunes

Yo prefiero la segunda porque funciona incluso si un archivo tiene la extensión incorrecta. En medios lentos puede ser más lento, ya que necesita acceder al archivo en lugar de simplemente trabajar con el nombre de archivo que obtuvo del portapapeles.

+0

gracias por apuntarme en la dirección correcta. Por extensión de archivo no parece funcionar aquí. Tendré que descubrir el byte mágico. –

0

Puede consultar fácilmente el portapapeles si contiene imag o no:

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