Pregunta

Actualmente estoy escribiendo un sistema que almacena metadatos para aproximadamente 140,000 imágenes ish almacenadas en una biblioteca de imágenes heredada que se están moviendo al almacenamiento en la nube. Estoy usando lo siguiente para obtener los datos jpg ...

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

Soy bastante nuevo en la manipulación de imágenes, pero esto está bien para obtener valores simples como ancho, alto, relación de aspecto, etc., pero no puedo averiguar cómo recuperar el tamaño del archivo físico del jpg expresado en bytes. Cualquier ayuda sería muy apreciada.

Gracias

Solución final que incluye un hash MD5 de la imagen para una comparación posterior

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

}
¿Fue útil?

Solución

Si obtiene su imagen directamente del archivo, puede usar el siguiente código para obtener el tamaño del archivo original en bytes.

 var fileLength = new FileInfo(filePath).Length; 

Si obtiene su imagen de otra fuente, como obtener un mapa de bits y componerlo con otra imagen, como agregar una marca de agua, tendrá que calcular el tamaño en tiempo de ejecución. Simplemente no puede usar el tamaño del archivo original, porque la compresión puede llevar a diferentes tamaños de datos de salida después de la modificación. En este caso, puede usar MemoryStream para guardar 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;
 }

Otros consejos

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 deberías hacer es escribir la imagen en una secuencia (por ejemplo, MemoryStream) y luego usar el tamaño de la secuencia.

System.Drawing.Image no le dará la longitud del archivo. Tienes que usar otra biblioteca para eso.

int len = (new System.IO.FileInfo(sFullPath)).Length;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top