2008-10-21 8 views
23

J'écris actuellement un système qui stocke des métadonnées pour environ 140 000 images ish stockées dans une bibliothèque d'images héritée qui sont déplacées vers le stockage en nuage. J'utilise ce qui suit pour obtenir les données jpg ...Comment obtenir la taille de fichier d'un "System.Drawing.Image"

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

Im assez nouveau pour la manipulation d'images, mais cela est bien beau pour obtenir des valeurs simples comme la largeur, la hauteur, rapport d'aspect, etc, mais ce que je ne peux pas travailler comment pour récupérer la taille du fichier physique du jpg exprimée en octets. Toute aide serait très appréciée.

Merci

solution finale incluant un hachage MD5 de l'image pour une comparaison ultérieure

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(); 

} 

Répondre

43

Si vous obtenez votre image directement à partir du fichier, vous pouvez utiliser le code suivant pour obtenir la taille du fichier original octets.

var fileLength = new FileInfo(filePath).Length; 

Si vous obtenez votre image à partir d'une autre source, comme obtenir un bitmap et composer avec une autre image, comme l'ajout de filigrane, vous devrez calculer la taille en exécution. Vous ne pouvez pas utiliser uniquement la taille de fichier d'origine, car la compression peut entraîner une taille différente des données de sortie après modification. Dans ce cas, vous pouvez utiliser MemoryStream pour enregistrer l'image à:

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 ne vous donnera pas la longueur du fichier de taille. Vous devez utiliser une autre bibliothèque pour cela.

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

Si vous ne possédez pas le fichier d'origine, la taille du fichier n'est pas claire car elle dépend du format et de la qualité de l'image. Donc, ce que vous auriez à faire est d'écrire l'image dans un flux (par exemple MemoryStream), puis d'utiliser la taille du flux.

Questions connexes