Как получить размер файла «System.Drawing.Image» - PullRequest
25 голосов
/ 21 октября 2008

В настоящее время я пишу систему, в которой хранятся метаданные для около 140 000 изображений, хранящихся в устаревшей библиотеке изображений, которые перемещаются в облачное хранилище. Я использую следующее, чтобы получить данные JPG ...

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

Я довольно новичок в манипулировании изображениями, но это хорошо для получения простых значений, таких как ширина, высота, соотношение сторон и т. Д., Но я не могу понять, как извлечь физический размер файла jpg, выраженный в байтах. Любая помощь будет высоко ценится.

Спасибо

Окончательное решение, включающее хеш-код изображения MD5 для последующего сравнения

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

}

Ответы [ 3 ]

45 голосов
/ 21 октября 2008

Если вы получаете ваше изображение непосредственно из файла, вы можете использовать следующий код, чтобы получить размер исходного файла в байтах.

 var fileLength = new FileInfo(filePath).Length; 

Если вы получаете свое изображение из другого источника, например, получаете одно растровое изображение и компонуете его с другим изображением, например, добавляете водяной знак, вам придется вычислять размер во время выполнения. Вы не можете просто использовать оригинальный размер файла, потому что сжатие может привести к другому размеру выходных данных после модификации. В этом случае вы можете использовать MemoryStream для сохранения изображения в:

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;
 }
2 голосов
/ 21 октября 2008

Если у вас нет исходного файла, размер файла неясен, так как он зависит от формата и качества изображения. Поэтому вам нужно записать изображение в поток (например, MemoryStream), а затем использовать размер потока.

1 голос
/ 21 октября 2008

System.Drawing.Image не даст вам длину файла размера. Вы должны использовать другую библиотеку для этого.

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