سؤال

وأنا أكتب حاليا نظام الذي يقوم بتخزين بيانات التعريف لحوالي 140000 الصور العش المخزنة ضمن مكتبة الصور القديمة التي يتم نقلها إلى سحابة التخزين. أنا باستخدام التالية للحصول على البيانات 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