2009-07-28 20 views
7

Vorrei trovare l'altezza/larghezza di un'immagine sul disco senza aprirlo, se possibile (per motivi di prestazioni).Leggere le proprietà estese dell'immagine in C#

proprietà La vetri per le immagini contiene informazioni come larghezza, altezza, profondità di bit, ecc, il che mi porta a credere che si sta memorizzando i metadati sul file da qualche parte. Come posso accedere a queste informazioni?

+0

possibile duplicato di [Come ottenere i dati EXIF ​​da un file utilizzando C#] (http: // stackoverflow.it/questions/58649/how-to-get-the-exif-data-from-a-file-using-c) – jgauffin

risposta

3

Ci sono alcune domande StackOverflow su come leggere le informazioni EXIF ​​dalle immagini, come ad esempio: How to get the EXIF data from a file using C#

+0

I dati EXIF ​​sono memorizzati all'interno del file, quindi è necessario aprirlo. Che non soddisfa i criteri dell'OP - non dire che i criteri dell'OP abbiano senso :) –

+0

Penso che il requisito dell'OP sia più nella direzione in cui vuole saltare la decompressione dell'immagine e la memoria allocativa per i dati bitmap. In questo caso, l'accesso ai metadati va bene. –

+0

IMO indica che non sta caricando i dati effettivi dell'immagine, l'apertura e la lettura dei metadati dovrebbe andare bene. Altrimenti non ci sono modi per ispezionare quel file. Il vero collo di bottiglia perf sarà caricare i dati dell'immagine, non i metadati. – huseyint

3

Il modo più semplice per eseguire ciò è che, supponendo che l'immagine sia quadrata, è necessario prendere la dimensione del file in byte e ottenere la radice quadrata. Questa sarà la tua larghezza e altezza.

256 bytes = 16px x 16px 

:-)

In alternativa, si può provare a leggere le informazioni EXIF ​​dell'immagine usando questo codeplex library

+1

Grande ipotesi che le immagini siano quadrate. – SteveM

+2

Mi sono sempre chiesto come sia stato calcolato da Windows in così poco tempo! – Brandon

+2

Wow! Le immagini potrebbero non essere quadrate. Hmmmmmm questo ci getta una chiave! ;) –

2

Windows non memorizza (questo) metadati in alcun posto speciale nel filesystem; la finestra Proprietà li legge semplicemente dal file immagine stesso.

Non penso che .NET offra funzioni per leggere solo i metadati da un'immagine senza caricare l'intera immagine. Se hai a che fare solo con un numero limitato di diversi formati di immagine (ad esempio solo JPEG, PNG e GIF), non dovrebbe essere troppo difficile leggere da te la dimensione dall'intestazione dell'immagine.

Se, d'altra parte, devi gestire molti formati di immagine, forse puoi dare un'occhiata al codice sorgente dello Unix file utility. Riesce a rilevare le dimensioni di molti, molti formati di immagine differenti ed è incredibilmente veloce da avviare.

2

Per ottenere la larghezza e l'altezza di un'immagine (in pratica, come le metti, i metadati) devi avere aprire il file, analizzare qualche tipo di informazione di intestazione e ottenere ciò che vuoi in quel modo.

Non è necessario leggere tutte le informazioni colore/bitmap, solo l'intestazione.

Questo è lo stesso modo in cui Windows è in grado di caricare le icone dai file dell'applicazione senza eseguirle effettivamente.

0

Per leggere le proprietà visualizzate da Windows Explorer è possibile utilizzare i controlli Microsoft Shell e Automazione componente. Il vantaggio di questo è che non è necessaria alcuna libreria di terze parti (l'oggetto COM è già lì) o codice aggiuntivo per analizzare l'intestazione dell'immagine e che funzionerà con una varietà di formati.

Codice di esempio può essere trovato in una risposta a un related question.

4

Utilizzare la classe System.Drawing.Image.

 Image img = Image.FromFile(fileName); 
     ImageFormat format = img.RawFormat; 
     Console.WriteLine("Image Type : "+format.ToString()); 
     Console.WriteLine("Image width : "+img.Width); 
     Console.WriteLine("Image height : "+img.Height); 
     Console.WriteLine("Image resolution : "+(img.VerticalResolution*img.HorizontalResolution)); 

     Console.WriteLine("Image Pixel depth : "+Image.GetPixelFormatSize(img.PixelFormat)); 
     Console.WriteLine("Image Creation Date : "+creation.ToString("yyyy-MM-dd")); 
     Console.WriteLine("Image Creation Time : "+creation.ToString("hh:mm:ss")); 
     Console.WriteLine("Image Modification Date : "+modify.ToString("yyyy-MM-dd")); 
     Console.WriteLine("Image Modification Time : "+modify.ToString("hh:mm:ss")); 
Problemi correlati