Comment obtenir la taille de fichier d'un & # 8220; System.Drawing.Image & # 8221;
-
03-07-2019 - |
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();
}
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;