2008-10-21 13 views
23

Attualmente sto scrivendo un sistema che memorizza metadati per circa 140.000 immagini ish memorizzate in una libreria di immagini legacy che vengono spostate nell'archivio cloud. Sto usando il seguente per ottenere i dati jpg ...Come ottenere la dimensione del file di "System.Drawing.Image"

System.Drawing.Image image = System.Drawing.Image.FromFile("filePath"); 

Im abbastanza nuovo per la manipolazione delle immagini, ma questo è bene per ottenere valori semplici come la larghezza, altezza, proporzioni, ecc, ma quello che non riesco a capire è come per recuperare la dimensione fisica del file del jpg espressa in byte. Qualsiasi aiuto sarebbe molto apprezzato.

Grazie

soluzione finale compreso un hash MD5 dell'immagine per dopo confrontarli

System.Drawing.Image image = System.Drawing.Image.FromFile(filePath); 

if (image != null) 
{ 
    int width = image.Width; 
    int height = image.Height; 
    decimal aspectRatio = width > height ? decimal.divide(width, height) : decimal.divide(height, width); 
    int fileSize = (int)new System.IO.FileInfo(filePath).Length; 

    using (System.IO.MemoryStream stream = new System.IO.MemoryStream(fileSize)) 
    { 
    image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    Byte[] imageBytes = stream.GetBuffer(); 
    System.Security.Cryptography.MD5CryptoServiceProvider provider = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
    Byte[] hash = provider.ComputeHash(imageBytes); 

    System.Text.StringBuilder hashBuilder = new System.Text.StringBuilder(); 

    for (int i = 0; i < hash.Length; i++) 
    { 
     hashBuilder.Append(hash[i].ToString("X2")); 
    } 

    string md5 = hashBuilder.ToString(); 
    } 

    image.Dispose(); 

} 

risposta

43

Se si ottiene l'immagine direttamente dal file, è possibile utilizzare il seguente codice per ottenere la dimensione del file originale in byte.

var fileLength = new FileInfo(filePath).Length; 

Se si ottiene l'immagine da altra fonte, come ottenere una bitmap e compongono altra immagine con, come l'aggiunta di filigrana si dovrà calcolare la dimensione in fase di esecuzione. Non è possibile utilizzare solo la dimensione del file originale, perché la compressione può portare a diverse dimensioni dei dati di output dopo la modifica. In questo caso, è possibile utilizzare MemoryStream per salvare l'immagine a:

long jpegByteSize; 
using (var ms = new MemoryStream(estimatedLength)) // estimatedLength can be original fileLength 
{ 
    image.Save(ms, ImageFormat.Jpeg); // save image to stream in Jpeg format 
    jpegByteSize = ms.Length; 
} 
1

System.Drawing.Image non vi darà la lunghezza del file di formato. Devi usare un'altra libreria per questo.

int len = (new System.IO.FileInfo(sFullPath)).Length; 
2

Se non si dispone del file originale, la dimensione del file non è chiara in quanto dipende dal formato e dalla qualità dell'immagine. Quindi, quello che dovresti fare è scrivere l'immagine in un flusso (ad esempio MemoryStream) e quindi utilizzare la dimensione del flusso.

Problemi correlati