2008-10-21 20 views
23

Actualmente estoy escribiendo un sistema que almacena metadatos de alrededor de 140,000 imágenes ish almacenadas dentro de una biblioteca de imágenes heredadas que se trasladan al almacenamiento en la nube. Estoy utilizando el siguiente para obtener los datos jpg ...Cómo obtener el tamaño de archivo de "System.Drawing.Image"

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

Im bastante nuevo para la manipulación de imágenes, pero esto está muy bien para conseguir los valores simples como anchura, altura, relación de aspecto, etc, pero lo que no puedo hacer ejercicio es cómo para recuperar el tamaño del archivo físico del jpg expresado en bytes. Cualquier ayuda sería muy apreciada.

Gracias

solución final incluyendo un hash MD5 de la imagen para su posterior comparación

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

} 

Respuesta

43

Si usted recibe su imagen directamente desde un archivo, puede utilizar el siguiente código para conseguir tamaño del archivo original en bytes.

var fileLength = new FileInfo(filePath).Length; 

Si usted recibe su imagen a partir de otra fuente, como conseguir un mapa de bits y lo componen otra imagen con, como la adición de marca de agua que tendrá que calcular el tamaño en tiempo de ejecución. No se puede simplemente usar el tamaño de archivo original, ya que la compresión puede generar diferentes tamaños de datos de salida después de la modificación. En este caso, puede utilizar MemoryStream para salvar la imagen en:

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 no le dará la longitud del archivo de tamaño. Tienes que usar otra biblioteca para eso.

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

Si no tiene el archivo original, el tamaño del archivo no es claro ya que depende del formato y la calidad de la imagen. Entonces, lo que tendría que hacer es escribir la imagen en una secuencia (por ejemplo, MemoryStream) y luego usar el tamaño de la secuencia.

Cuestiones relacionadas