2011-01-23 15 views
6

L'utente fa clic con il pulsante destro del mouse su un file (ad esempio sul desktop) e fa clic su "copia". Ora come faccio a determinare in C# se il file copiato negli Appunti è un tipo di immagine?Determina se il file copiato negli Appunti è un'immagine

Clipboard.ContainsImage() non funziona in questo caso

Di seguito determina se un'immagine è direttamente copiato negli appunti, non se un file viene copiato nella clipboard

IDataObject d = Clipboard.GetDataObject(); 

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

Per sia chiaro voglio determinare se il 'file' copiato negli appunti è un'immagine.

Modifica: le risposte sono ottime, ma come si ottiene il nome file di un file copiato negli Appunti? Clipboard.getText() non sembra funzionare .. Edit2: Clipboard.GetFileDropList() funziona

+1

In molti casi, è sufficiente controllare l'estensione del file. Comunque puoi usare entrambi il metodo 'Magic-Bytes' (come detto da CodeInChaos) e il metodo' Exception Handling' (come ha detto Shekhar_Pro). Inoltre c'è uno strumento chiamato 'TrID', che è un'utilità di riga di comando libera che può essere utilizzata per determinare i tipi di file utilizzando un database delle firme. http://mark0.net/soft-trid-e.html – fardjad

risposta

6

È possibile verificarlo in questo modo (non esiste un modo integrato per farlo) Leggere il file e utilizzarlo in un oggetto immagine grafica se sarà funzionante, funzionerà correttamente altrimenti solleverà un OutOfMemoryException.

ecco un esempio di codice:

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

Si lavorerà per BMP, GIF, JPEG, PNG, formati di file TIFF


Aggiornamento

ecco il codice per ottenere il 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 
    } 
} 
+0

funziona correttamente, tranne che non riesco a ottenere il nome file del file copiato negli appunti. qualche idea su come ottenerlo? –

+0

ho aggiornato il mio codice .. –

3

Ottieni il nome file dagli Appunti (copiare un file nella clip-board copia solo il suo nome). Quindi controlla se i file sono immagini.

Ci sono due modi per farlo:

  1. base all'estensione del file
  2. Aprire il file e verificare la presenza di magia-byte indicando i formati immagine più comuni

io preferisco la seconda, perché funziona anche se un file ha l'estensione sbagliata. Sui media lenti potrebbe essere più lento, dal momento che è necessario accedere al file invece di utilizzare solo il nome del file che si ottiene dagli appunti.

+0

grazie per avermi indicato nella giusta direzione. Per estensione del file non sembra funzionare qui. Dovrò capire la cosa del byte magico. –

0

È possibile controllare facilmente gli appunti se contiene imag e oppure no:

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