Frage

Ich schreibe derzeit ein System, das in einer Legacy-Bildbibliothek gespeichert Metadaten für rund 140.000 ish Bilder speichert, die auf Cloud-Speicher verschoben werden. Ich bin mit dem folgenden, um die jpg-Daten zu erhalten ...

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

Im ganz neu in die Bildbearbeitung, aber das ist in Ordnung für immer einfache Werte wie Breite, Höhe, Seitenverhältnis usw., aber was ich kann nicht arbeiten, ist, wie die physische Dateigröße des jpg in Bytes abzurufen. Jede Hilfe wäre sehr geschätzt.

Danke

Endlösung mit einem MD5-Hash des Bildes für einen späteren Vergleich

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

}
War es hilfreich?

Lösung

Wenn Sie Ihr Bild erhalten direkt aus der Datei, können Sie den folgenden Code verwenden, um Größe der Originaldatei in Bytes zu erhalten.

 var fileLength = new FileInfo(filePath).Length; 

Wenn Sie Ihr Bild aus einer anderen Quelle erhalten, wie eine Bitmap bekommen und es mit anderen Bildausschnitt wählen, wie Wasserzeichen hinzufügen, die Sie Größe in der Laufzeit wird berechnen. Sie können nicht nur ursprünglichen Dateigröße verwenden, da Komprimierung auf unterschiedliche Größe der Ausgangsdaten nach der Änderung führen kann. In diesem Fall können Sie Memory verwenden zu speichern Bild auf:

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

Andere Tipps

Wenn Sie nicht die Originaldatei haben, die Dateigröße ist nicht klar, wie es auf das Bildformat und Qualität abhängt. Also, was Sie haben zu tun würde, ist das Bild in einen Stream schreiben (z Memorystream) und verwenden Sie dann die Größe des Stroms.

System.Drawing.Image werden Sie nicht die Dateilänge der Größe geben. Sie haben eine andere Bibliothek dafür verwenden.

int len = (new System.IO.FileInfo(sFullPath)).Length;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top