문제

현재 클라우드 스토리지로 이동중인 레거시 이미지 라이브러리에 저장된 약 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();

}
도움이 되었습니까?

해결책

파일에서 직접 이미지를 가져 오면 다음 코드를 사용하여 원본 파일 크기를 바이트로 얻을 수 있습니다.

 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)에 쓰고 스트림의 크기를 사용하는 것입니다.

System.Drawing.Image 크기의 파일 길이를주지 않습니다. 다른 라이브러리를 사용해야합니다.

int len = (new System.IO.FileInfo(sFullPath)).Length;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top