Domanda

Attualmente sto scrivendo un sistema che archivia i metadati per circa 140.000 immagini ish archiviate all'interno di una libreria di immagini legacy che vengono spostate nel cloud storage. Sto usando il seguente per ottenere i dati jpg ...

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

Sono abbastanza nuovo nella manipolazione delle immagini, ma va bene per ottenere valori semplici come larghezza, altezza, proporzioni ecc. ma ciò che non riesco a capire è come recuperare la dimensione del file fisico del jpg espressa in byte. Qualsiasi aiuto sarebbe molto apprezzato.

Grazie

Soluzione finale che include un hash MD5 dell'immagine per un confronto successivo

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

}
È stato utile?

Soluzione

Se ottieni l'immagine direttamente dal file, puoi utilizzare il seguente codice per ottenere la dimensione del file originale in byte.

 var fileLength = new FileInfo(filePath).Length; 

Se ottieni l'immagine da un'altra fonte, come ottenere una bitmap e comporla con un'altra immagine, come aggiungere filigrana dovrai calcolare la dimensione in fase di esecuzione. Non è possibile utilizzare solo le dimensioni del file originale, poiché la compressione può comportare dimensioni diverse dei dati di output dopo la modifica. In questo caso, è possibile utilizzare MemoryStream per salvare l'immagine in:

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;
 }

Altri suggerimenti

Se non si dispone del file originale, la dimensione del file non è chiara in quanto dipende dal formato e dalla qualità dell'immagine. Quindi, ciò che dovresti fare è scrivere l'immagine su uno stream (ad esempio MemoryStream) e quindi utilizzare le dimensioni dello stream.

System.Drawing.Image non ti darà la lunghezza del file di dimensioni. Devi usare un'altra libreria per quello.

int len = (new System.IO.FileInfo(sFullPath)).Length;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top