如何获取“ System.Drawing.Image”的文件大小
c#
image
image-manipulation
image-processing
5
0

我目前正在编写一个系统,该系统存储存储在旧图像库中的大约140,000 ish图像的元数据,这些图像正被移至云存储。我正在使用以下内容获取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();

}
参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

如果直接从文件中获取图像,则可以使用以下代码获取原始文件的大小(以字节为单位)。

 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;
 }
收藏
评论

如果没有原始文件,则文件大小不清楚,因为它取决于图像格式和质量。因此,您要做的就是将图像写入流(例如MemoryStream),然后使用流的大小。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号