
هل تطبّع قيم RGB على 255 أم على 256؟
يحلّل مبرمج الرسوميات بيكا فيانيا نين طريقتين شائعتين لتحويل قيم RGB ذات 8 بتات إلى أرقام عائمة وإعادتها، ويشرح متى تكون القسمة على 255 الخيار الصحيح ومتى يمكن تبرير القسمة على 256.
تحويل قيم الألوان ذات 8 بتات إلى أرقام عائمة وإعادتها قرار من أوائل القرارات في أي برنامج لمعالجة الصور، وفيه مدرستان. نشر مبرمج الرسوميات بيكا فيانيا نين تحليلاً للسؤال على مدونته 30fps.net، يقارن فيه القسمة المعيارية على 255 بالبديل الذي يضيف إزاحة 0.5 ويقسم على 256.
الصيغتان
يحوّل النهج المعياري البكسلات عبر img / 255.0 ويكتبها عائدة عبر trunc(result * 255 + 0.5): يتحول العدد 0 إلى 0.0 و255 إلى 1.0، وهي القاعدة نفسها التي تعتمدها وحدات الرسوميات للأشكال المطبَّعة غير المؤشَّرة. أما البديل فيحوّل عبر (img + 0.5) / 256.0 ويكتب عبر trunc(result * 256)، بحيث يقع كل قيمة عشرية في منتصف المسافة بين عددين صحيحين تماماً.
الثمن العملي للبديل أن الأسود لم يعد 0.0: إذ يُفكّ العدد 0 إلى 0.001953125، ما يعني أن أي شيفرة تريد كشف البكسلات السوداء يجب أن تعرف هذا الثابت وترتبط بمدى 8 بتات. ويلاحظ الكاتب أن الصورة تعود بلا فقدان مع الصيغة المعيارية، وأن عدم دقتها — إذ يساوي 128/255 نحو 0.501961 — يبقى في أقل بت أهمية، بخطأ نسبي قدره 0.00001 في المئة تقريباً.
خانات بنصف العرض عند الطرفين
ضعف الصيغة المعيارية يظهر عند الحدود. فبما أن مداها العائم أوسع قليلاً من [0, 1]، تكون الخانات التي تُقرَّب إلى 0 وإلى 255 بنصف عرض الخانات الأخرى، لذا يولّد التشويش الموزَّع بانتظام القيم الطرفية بنصف التكرار. ويعرض المقال ذلك بمدرَّج تكرار لمليون قيمة عشوائية، ثم يرى أن ذلك نادراً ما يهم: فالقيم الواقعة خارج المدى قليلاً تُقرَّب إلى العدد الصحيح، وطرح 0.005 من الأسود ينتهي عند 0 في الحالتين.
بلغة نظرية التكميم، الخياران هما مُكمِّم من نوع mid-riser بـ255 مستوى ومُكمِّم من نوع mid-tread بـ256. وخطأ إعادة البناء أقل قليلاً عند القسمة على 256 — متوسط خطأ مطلق 1/1024 مقابل 1/1020 — لكن فقط حين تتحكم الشيفرة نفسها في الترميز وفك الترميز معاً. وتحميل صور الآخرين بمعامل قياس بديل هو نظرياً فك ترميز خاطئ، وهو يخلط بين المُكمِّمين.
ما العمل
الخلاصة عملية عن قصد: إذا كنت تعالج صوراً لم تنشئها فطبِّع على 255. أما القسمة على 256 فمبرَّرة عندما تتحكم في الحفظ والتحميل معاً، ولا تحتاج إلى أن يُقابَل الصفر بالصفر، وتقبل ربط شيفرة المعالجة بمدى 8 بتات. ويناقش المقال أيضاً «الطريقة الأفضل» التي اقترحها كريس لومونت لاحقاً، وهي تفكّ الترميز بـk/255.0 وترمّز بـclamp(floor(x * 256), 0, 255)، محافظةً على المدى الكامل وخانات متساوية مقابل خطأ تكميم يقارب الضعف ويبلغ ذروته عند الطرفين.
SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي
نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.