الدرس 6 من 9
قراءة ترويسة ملف حقيقيّ
- 14 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
عرض صورة PNG وارتفاعها من بايتاتها
الشرح
تعلّمت قراءة ترويسة مخترَعة، وهذه ترويسة ملف حقيقيّ تجده في جهازك: صورة PNG. ويبدأ كل ملف PNG بثمانية بايتات توقيعًا، ثم تأتي قطع (chunks) متتالية، أوّلها دائمًا قطعة اسمها IHDR تحمل أبعاد الصورة. وكل حقول PNG بكبير الطرف، ويسمّى هذا الترتيب أيضًا ترتيب الشبكة (network byte order)، وهو المعتاد في الصيغ التي تنتقل بين أجهزة مختلفة.
والقطعة الواحدة أربعة حقول متتالية: طول بياناتها في أربعة بايتات، ثم نوعها في أربعة بايتات نصًّا، ثم بياناتها، ثم مجموع اختباري في أربعة بايتات. وبيانات IHDR ثلاثة عشر بايتًا أوّلها ما يهمّنا هنا:
الإزاحة الحقل 0 توقيع PNG (ثمانية بايتات) 8 طول بيانات القطعة (أربعة بايتات) 12 نوع القطعة IHDR (أربعة بايتات) 16 العرض (أربعة بايتات، كبير الطرف) 20 الارتفاع (أربعة بايتات، كبير الطرف) 24 عمق البت (بايت) 25 نوع اللون (بايت)
فالعرض والارتفاع يقعان عند الإزاحة 16، بعد التوقيع والطول والنوع. والدالة struct.unpack_from(fmt, data, offset) تقرأ من إزاحة تحدّدها دون أن تقصّ البيانات، فتكتب الإزاحة في مُعامِلها الثالث.
المطلوب
اكتب الدالة parse_png(data) لتقرأ ترويسة PNG وتُرجع قاموسًا مفاتيحه "width" و"height" و"bit_depth" و"color_type". اقرأ العرض والارتفاع بكبير الطرف من إزاحتهما، واقرأ عمق البت ونوع اللون بايتًا بايتًا.
الفحوص
5 فحوص- يقرأ عرض الصورة وارتفاعها
- يقرأ أبعادًا أخرى من إزاحتها لا من أوّل الملف
- يقرأ العرض بكبير الطرف
- يقرأ عمق البت ونوع اللون
- القاموس بمفاتيحه الأربعة