Question

Je suis en train d'écrire 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 et transférées vers un stockage en nuage. J'utilise ce qui suit pour obtenir les données jpg ...

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

Je suis assez nouveau pour la manipulation d’images, mais c’est bien pour obtenir des valeurs simples comme la largeur, la hauteur, le rapport de format, etc. Ce que je ne peux pas expliquer, c’est comment récupérer la taille du fichier physique du jpg exprimé en octets. Toute aide serait la bienvenue.

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

}
Était-ce utile?

La solution

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

 var fileLength = new FileInfo(filePath).Length; 

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

Autres conseils

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. Vous devez donc écrire l'image dans un flux (par exemple, MemoryStream), puis utiliser la taille du flux.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top