Pergunta

Atualmente, estou escrevendo um sistema que armazena dados de meta para cerca de 140.000 imagens ish armazenados dentro de uma biblioteca de imagens legado que estão sendo movidos para armazenamento em nuvem. Estou usando o seguinte para obter os dados jpg ...

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

Im muito novo para manipulação de imagem, mas isso é bom para obter valores simples, como largura, altura, relação de aspecto etc, mas o que eu não posso trabalhar fora é como recuperar o tamanho do jpg expresso em bytes do arquivo físico. Qualquer ajuda seria muito apreciada.

Graças

solução final, incluindo um hash MD5 da imagem para posterior comparação

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

}
Foi útil?

Solução

Se você receber sua imagem diretamente do arquivo, você pode usar o seguinte código para obter o tamanho do arquivo original em bytes.

 var fileLength = new FileInfo(filePath).Length; 

Se você receber sua imagem de outra fonte, como a obtenção de um bitmap e compondo-a com outra imagem, como a adição de marca d'água que terá de tamanho calcular em tempo de execução. Você não pode apenas usar o tamanho do arquivo original, porque a compressão pode levar a diferentes tamanhos de dados de saída após a modificação. Neste caso, você pode usar MemoryStream para salvar imagem para:

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

Outras dicas

Se você não tiver o arquivo original, o tamanho do arquivo não é clara, uma vez que depende do formato e qualidade de imagem. Então, o que você tem a fazer é gravar a imagem em um fluxo (por exemplo MemoryStream) e, em seguida, usar o tamanho do fluxo.

System.Drawing.Image não lhe dará o comprimento do tamanho do arquivo. Você tem que usar outra biblioteca para isso.

int len = (new System.IO.FileInfo(sFullPath)).Length;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top