2010-02-05 16 views
6

ho trovato questo metodo:Come posso ottenere la risoluzione di un'immagine? (JPEG, GIF, PNG, JPG)

Graphics g = e.Graphics; 
Bitmap bmp = new Bitmap("winter.jpg"); 
g.DrawImage(bmp, 0, 0); 
Console.WriteLine("Screen resolution: " + g.DpiX + "DPI"); 
Console.WriteLine("Image resolution: " + bmp.HorizontalResolution + "DPI"); 
Console.WriteLine("Image Width: " + bmp.Width); 
Console.WriteLine("Image Height: " + bmp.Height); 

SizeF s = new SizeF(bmp.Width * (g.DpiX/bmp.HorizontalResolution), 
        bmp.Height * (g.DpiY/bmp.VerticalResolution)); 

Console.WriteLine("Display size of image: " + s); 

Ma io non capisco come per andare a prendere quello che sto cercando. Non sono interessato a DPI, ho solo bisogno dei numeri 1024x768, 1200x1024 ecc. Inoltre, dovrei creare un nuovo oggetto immagine ogni volta che voglio trovare la risoluzione dell'immagine?

Sto creando un'applicazione che elenca le immagini correnti in una determinata cartella, quindi qualsiasi aiuto sarebbe apprezzato. :)

risposta

11

"1024x768" è chiamato solo "risoluzione" nel contesto delle impostazioni di visualizzazione di un computer, e anche in questo caso è uno spiacevole malinteso. Nell'imaging "1024x768" è semplicemente la larghezza & altezza dell'immagine, così come altri hanno già accennato, hai già mostrato il codice che recupera questi numeri. Tweaked leggermente:

var img = Image.FromFile(@"C:\image.jpg"); 
Console.WriteLine(img.Width + "x" + img.Height); // prints "1024x768" (etc) 

L'unico metodo built-in per ottenere i numeri che stai dopo è la creazione di una nuova istanza (e, in effetti, la decodifica l'intera immagine) - che sta per essere altamente inefficiente se è necessario recuperare solo questi numeri per diverse centinaia di immagini. Evitare questo è difficile; qui è un punto di partenza: How do I reliably get an image dimensions in .NET without loading the image?


Quando si parla di "risoluzione" che normalmente si riferiscono al numero di dots, or pixels, per inch. La classe Bitmap memorizza questo valore nelle proprietà HorizontalResolution/VerticalResolution, mentre la classe Graphics in DpiX/DpiY.

Questo calcolo:

bmp.Width * (g.DpiX/bmp.HorizontalResolution) 

possono essere riorganizzate per chiarezza come segue:

(bmp.Width/bmp.HorizontalResolution) * g.DpiX 

dove la parte tra parentesi calcola la larghezza dell'immagine in pollici.Moltiplicando per g.DpiX si ottiene il numero di pixel nell'oggetto Graphics che hanno la stessa larghezza in pollici dell'immagine bmp.

2

Per ottenere la dimensione:

string path = @"C:\winter.jpg"; 
Image img = Image.FromFile(path); 
Console.WriteLine("Image Width: " + img.Width); //equals img.Size.Width 
Console.WriteLine("Image Height: " + img.Height); //equals img.Size.Height 

Ecco un full list of System.Drawing.Image properties, se caso desidera visualizzare altri.

Non sono sicuro che ci sia un modo più rapido per un'intera directory, con Windows Vista/7 potrebbe esserci una nuova API che contiene queste informazioni, ma non l'ho trovata.

2

Sicuramente avete risposto alla tua domanda, è semplice come questo:

Bitmap bmp = new Bitmap(@"winter.bmp");  
Console.WriteLine("Image Width: " + bmp.Width); 
Console.WriteLine("Image Height: " + bmp.Height); 

Le informazioni DPI è veramente utile solo quando si sta visualizzando o stampare l'immagine. Nel codice di esempio si sta convertendo l'immagine in un oggetto Graphics che può essere utilizzato per disegnarlo sullo schermo.

Per rispondere alla seconda parte della domanda, è possibile analizzare l'intestazione del file JPEG per trovare le informazioni sulla larghezza/altezza senza caricare effettivamente l'immagine. Ma per fare questo è necessario conoscere le informazioni di intestazione e il formato del file per i file JPEG.

Problemi correlati