web-dev-qa-db-fra.com

Comment obtenir la taille de fichier d'un "System.Drawing.Image"

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ées qui sont déplacées vers le stockage cloud. J'utilise ce qui suit pour obtenir les données jpg ...

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

Je suis assez nouveau dans la manipulation d'images, mais c'est bien pour obtenir des valeurs simples comme la largeur, la hauteur, les proportions, etc., mais ce que je ne peux pas savoir, c'est comment récupérer la taille du fichier physique du jpg exprimé en octets. Toute aide serait très appréciée.

Merci

Solution finale comprenant 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();

}
26
Nick Allen

Si vous obtenez votre image directement à partir d'un fichier, vous pouvez utiliser le code suivant pour obtenir la taille du fichier d'origine en octets.

 var fileLength = new FileInfo(filePath).Length; 

Si vous obtenez votre image à partir d'une autre source, comme obtenir une image bitmap et la composer avec une autre image, comme ajouter un filigrane, vous devrez calculer la taille au moment de l'exécution. Vous ne pouvez pas simplement utiliser la taille du 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 dans:

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;
 }
47
Ilya Ryzhenkov

Si vous n'avez 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 devez faire est d'écrire l'image dans un flux (par exemple MemoryStream), puis d'utiliser la taille du flux.

2
Stefan Schultze

System.Drawing.Image ne vous donnera pas la longueur du fichier. Vous devez utiliser une autre bibliothèque pour cela.

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