سؤال

أنا تحميل صورة نقطية من ملف JPG. إذا كانت الصورة ليست 24 بت rgb، أود تحويلها. يجب أن يكون التحويل سريعا إلى حد ما. الصور التي أقوم بتحميلها تصل إلى ضخمة (9000 * 9000 بكسل مع حجم مضغوط من 40-50 ميجابايت). كيف يمكن القيام بذلك؟

راجع للشغل: لا أريد استخدام أي مكتبات خارجية إن أمكن. ولكن إذا كنت تعرف فئة فائدة مفتوحة للمصدر أداء مهام التصوير الأكثر شيوعا، سأكون سعيدا لسماع ذلك. شكرا مقدما.

هل كانت مفيدة؟

المحلول

يجب أن تبدأ JPEG مع 0xFF 0xD8. بعد ذلك ستجد حقول مختلفة بالتنسيق:

  1. معرف الحقل 2 بايت
  2. طول الحقل، باستثناء المعرف الميداني. 2 بايت.
  3. بيانات متغيرة.

تحليل من خلال الحقول. المعرف الذي ستبحث عنه هو 0xff 0xc0. وهذا ما يسمى SOF0، ويحتوي على الطول والعرض وعمق البت، وما إلى ذلك. 0xFF 0xC0 سوف يتبعه بايت اثنين من الحقل. بعد ذلك سيكون بايت واحد يظهر عمق البت، والذي سيكون عادة 8. ثم سيكون هناك بايتان للارتفاع، واثنين من العرض، وبايت واحد لعدد المكونات؛ عادة ما يكون هذا 1 (للغريس) أو 3. (للون)

نصائح أخرى

هذا ليس شيئا لقد جربته نفسي، لكنني أعتقد أنك قد تحتاج إلى acccess معلومات exif الصورة كدخول.

تحقق من دخول سكوت هانسيلمان على الوصول إلى معلومات exif من الصور.

Standard .Net. System.Drawing مساحة الاسم يجب أن يكون كل ما تحتاجه، ولكن ربما لن يكون فعالا للغاية. سوف يقوم بتحميل كل شيء في ذاكرة الوصول العشوائي، إلغاء ضغطه، تحويله (ربما عن طريق إصدار نسخة) ثم إعادة ضغط وحفظه. إذا كنت تهدف إلى أداء عال، أخشى أنك قد تحتاج إلى النظر في مكتبات C / C ++ وجعل مغازلة .NET لهم.

بقدر ما أعرف JPG هو دائما 24 BPP. الشيء الوحيد الذي يمكن أن يتغير سيكون هو CMY (K؟) بدلا من ذلك ثم RGB. سيتم تخزين هذه المعلومات في الرأس. لسوء الحظ، ليس لدي أي وسيلة لإنشاء صورة CMYK لاختبار ما إذا كانت التحميل في صورة نقطية ستحولها تلقائيا.

سيقرأ السطر التالي الملف في الذاكرة:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat سوف اقول لك تنسيق الصورة. ومع ذلك، لا يمكنني اختبار ما يفعل تحميل الملف مع الملفات بخلاف 24BPP RGB JPGS. يمكنني فقط أن أوصي بأن تجربته.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top