عند وضع صورة داخل إطار ثابت، نحتاج إلى قرار واضح: هل نعرض الصورة كاملة مع ترك مساحة فارغة، أم نملأ الإطار ونقص الأجزاء الزائدة؟ ثم تأتي مشكلة أخرى صغيرة في الظاهر: أبعاد الصور أعداد صحيحة، وقد ينتج عن الحساب نصف بكسل أو ثلث بكسل.
أشارك مثالًا من Idraaak Image Fit، وهي مكتبة Rust صغيرة أنشرها ضمن مشروع إدراك الذي أديره. وظيفتها حساب الأبعاد ومستطيل القص فقط؛ تنفيذ تغيير حجم الملف والقص نفسه مسؤولية مكتبة معالجة الصور التي تستخدمها في برنامجك.
مثال بالأرقام
لدينا صورة 1200 × 800 بكسل، ونريد وضعها داخل إطار 500 × 375 بكسل:
١) contain: نستخدم معامل القياس الأصغر حتى تدخل الصورة كاملة. العرض يصبح 500، والارتفاع المحسوب نحو 333.33، فتُرجع المكتبة 500 × 333 بكسل. يبقى فراغ رأسي داخل الإطار، وعلى التطبيق اختيار طريقة عرضه.
٢) cover: نستخدم معامل القياس الأكبر لتغطية الإطار. الارتفاع يصبح 375، والعرض المحسوب 562.5، فتُرجع المكتبة 563 × 375 بكسل. بعدها نحتفظ بمستطيل 500 × 375 يبدأ عند x=31 وy=0 في الصورة التي غُيّر حجمها؛ أي نقص 31 بكسل من اليسار و32 من اليمين.
سبب اختلاف التقريب
في contain يُقرّب البعد غير المقيّد إلى الأسفل حتى لا تتجاوز الصورة الإطار. وفي cover يُقرّب إلى الأعلى حتى لا يبقى جزء غير مغطى. لذلك قد تختلف نسبة الأبعاد النهائية قليلًا عن النسبة الرياضية المثالية بسبب التقريب إلى بكسلات صحيحة.
من التفاصيل المهمة أن إحداثيات القص تخص الصورة بعد تغيير حجمها، وليست إحداثيات على الصورة الأصلية.
ماذا يحدث عند منع التكبير؟
إذا كانت صورة 200 × 100 تدخل أصلًا داخل الإطار، فإن contain يحافظ على مقاسها عند منع التكبير. أما cover فيُرجع UpscalingRequired إذا كان ملء الإطار يحتاج إلى تكبير. كذلك تُرفض الأبعاد الصفرية، وتُعاد حالة خطأ إذا أدى التصغير إلى بُعد أقل من بكسل بدل فرض مقاس قد يشوّه النتيجة.
المكتبة متاحة برخصة MIT ودون اعتماديات خارجية. وتوجد اختبارات آلية للحسابات والأخطاء وأمثلة التوثيق. هذه مشاركة لسلوك المشروع الحالي، وليست إعلانًا عن إصدار جديد.
في خطوط معالجة الصور لديكم، هل تفضّلون إرجاع خطأ عند الحاجة إلى تكبير ممنوع، أم الانتقال إلى عرض الصورة كاملة مع هوامش يختارها التطبيق؟
وضعت شرح هذا المثال وسلوك الأخطاء وروابط الكود في صفحة المشروع على إدراك:
لا يوجد تعليقات بعد، كن أول من يبدأ النقاش