بدلا من ألف كلمة ...xZibit سعيد أيضًا ، لأنه يتم إدراج صور GIF هنا في ملصقات لإدراجها في صور GIF لـ KDPV!والآن عن تفاصيل التنفيذ.
بدأ كل شيء بمناقشة في دردشة مطور Telegram حول الميزة القادمة:
![بوهدان هوربيشكو ، [04/04/19 20:21] حسنًا ، ولكن من المحتمل أن يقبل الروبوت فقط صور متحركة ، ثم يقوم بتحويل ... | فيتالي ، [07/04/19 20:22] من gif إلى جيسون؟ كنت قد بحثت :))) | بوهدان هوربيشكو ، [04.07.19 20:22] ولماذا لا؟ هناك محرر نماذج PlayCanvas في JSON. | Vitaly ، [04/04/19 8:23 م] وكيف gif؟ تصدير بكسل بواسطة بكسل؟ :) | بوهدان هوربيشكو ، [04/04/19 20:24] بالطبع ، لقد شهد عالم تكنولوجيا المعلومات ولن يتسامح مع مثل هذه التشوهات.](https://habrastorage.org/webt/zu/s5/x1/zus5x1ydd89sejezp98ztbnygto.png)
قال رجل - رجل فعل! تم كتابة أول نموذج أولي في Pillow و svgwrite ، بتوزيع GIF إلى وحدات البكسل وتحويلها إلى مربعات متجهة ذات معاينات في SVG ، في يوم واحد.
بدأت المرح أبعد ...
JSON هو شكل مفتوح ، قالوا ...
حتى الآن ، مع التنسيقات في Telegram ، استمروا في الخداع. قدمت دعما للرسوم المتحركة GIF - في الواقع ، يتم تحويلها إلى فيديو MP4. تم دعم الملصقات - يتم تحميلها إلى PNG ، لكن يتم تحويلها إلى WebP. هذه المرة ، كل شيء أكثر صدقًا: عند المدخل ، ثم عند الخروج.
بالنسبة إلى الملصقات المتحركة ، لا يستخدم Telegram صور GIF أو مقاطع فيديو أو حتى بعض تنسيقات رسومات المتجهات الراسخة مثل SVG أو لا سمح الله Cthulhu! - فلاش. يستخدم تنسيقًا جديدًا ظهر من تحت Airbnb - Lottie. حتى الآن ، كان له بعض الشهرة بين مطوري الأجهزة المحمولة ، ولكن بفضل Telegram ، قد يكتسب المزيد من الشعبية.
في جوهرها ، ملفات Lottie عبارة عن مشاريع Adobe After Effects متسلسلة من JSON والتي تزيد من جميع ميزات هذا البرنامج إلى الحد الأقصى. مع العرض ، للأسف ،
كل شيء ليس وردية للغاية . على الرغم من وجود العديد من التطبيقات "الرسمية" الجاهزة للمكتبة لعرض Lottie ، فقط للمنصات التي يغطيها Telegram: Android و iOS و Qt و Web - يتم تطبيق جزء فقط من إمكانيات التنسيق في كل هذه التطبيقات. ذهب Telegram إلى أبعد من ذلك
وقيد قائمة الميزات المدعومة ، وكذلك "خرج" بتنسيقه الخاص ، والذي يختلف عن Lottie المعتاد بمجرد التعبئة في GZip والمعلمة
"tgs": 1
. أعتقد أنني أعرف أين يعمل دينيس بوبوف الآن! :-)
وإذا كان كل شيء جيدًا مع الوثائق الخاصة بالمكتبات الخاصة بأنظمة تشغيل مختلفة ، فلسوء الحظ ، لم يكن من الممكن العثور على بعض وصف جهاز التنسيق على الأقل - فقط
مخطط JSON في مصادر lottie-web. اضطررت إلى العبث في الرسوم المتحركة الموجودة لفهم المفاهيم العامة للتنسيق. كانت هناك أيضًا تباينات بين الملفات الحقيقية والمخطط: على وجه الخصوص ، في
طبقات النوع 4 ، وفقًا للمخطط ، يتم تخزين الكائنات المتداخلة في خاصية
"it"
- ومع ذلك ، في الملفات الحقيقية يُطلق على
"shapes"
، و
"it"
لا يعمل.
الفروق الدقيقة في الشكل:
- يتكون الملف من طبقات. على عكس GIF ، هنا يمكن أن يكون لكل طبقة وقت بداية ونهاية تعسفيين للعرض. يمكن تطبيق تحويلات متنوعة على الطبقة (بتعبير أدق ، من الضروري ): القياس ، الدوران ، تغيير الشفافية ، إلخ. يمكن أن تكون الطبقات ثلاثية الأبعاد (محظورة على Telegram).
- طبقة تتكون من "الأشكال". لديهم العديد من الأنواع ، لا يمكن استخدام بعضها في Telegram. في الممارسة العملية ، لكي تظهر طبقة ما ، يجب أن تتضمن ثلاثة أشكال: مسار (في الرسوم المتحركة النهائية ، يكون هذا عادةً من النوع
"sh"
- منحنيات بيزير ؛ يستخدم المحول حتى الآن فقط النوع "rc"
- المستطيلات) ، وملء (النوع "fl"
) ، والتحول ( اكتب "tr"
). - يمكنك حتى تضمين العناصر النقطية وإنشاء طبقات نصية وإقامة علاقات بين معلمات الطبقة والشكل من خلال التعبيرات. كل هذه الأشياء الجيدة محظورة أيضًا على Telegram.
المشكلة الأولى تتبع مباشرة من هنا:
التكرار . على الرغم من أن القيم الافتراضية لمعلمات التحويل قد تمت إضافتها مؤخرًا إلى مخطط JSON ، إلا أنها لا يتم تنفيذها في المكتبات. لذا فإن طلبهم صراحة لا يزال ضروريًا.
يبدو أن هذه ليست مشكلة على الإطلاق؟ حتى GZip البسيطة تقوم بعمل جيد في ضغط البيانات المتكررة بشكل صارخ ، ويتحول 1 ميجابايت من JSON الخام بطريقة سحرية إلى بضع عشرات من الكيلوبايت ، والتي تتسلل بهدوء إلى الحد المعلن وهو 64 كيلو بايت. كان هناك!
أقوم بالتحميل ، مما يعني رسمًا متحركًا ممتلئًا يعرض lottie-web بهدوء في Telegram - وهنا بدلاً من فن البكسل الجميل المشروط ، تبدو الصورة الضبابية في وجهي هي:

ما هذا؟ لكن اتضح أن هناك بوضوح
حد غير محدد
قدره 1 ميغابايت على البيانات التي تم فك ضغطها.
أكده ممثل فريق Telegram بسرعة وأعلن عن الزيادة المقبلة في الحد الأقصى البالغ 2 ميغابايت.
حتى إذا تم حل هذه المشكلات ، فإن الملصقات التي تتجاوز 1 ميغابايت من البيانات غير المضغوطة والتي لا تحتوي على تحويلات ، لن تكون متاحة لمستخدمي الإصدارات القديمة من Telegram. لذلك سوف تضطر إلى الامتثال للقيود في المستقبل.
الشفافية مهمة.
الوسادة ، إلى جانب OpenCV ، يمكن أن يطلق عليها معيار الصناعة لمعالجة الصور في بيثون. علاوة على ذلك ، تم تحسينه جيدًا لميزات GIF: إنه يدعم الألوان المفهرسة ويوفر إمكانية الوصول إلى اللوحة. يدعم تحويل مخطط البكسل إلى صفيف NumPy ، وهو أمر مهم للمعالجة المنتجة. حتى يجمع إحصائيات عن الألوان! ولكن كانت هناك أيضا عيوب:
- لا توجد طريقة موثقة للحصول على فهرس الألوان الشفافة. كان عليّ أن أفترض كحل مؤقت أن اللون الشفاف هو الأكثر شيوعًا ، لكن في صور GIF الحقيقية ليست هذه هي الحالة دائمًا.
- نفس الشيء مع التأخير بين الإطارات: تعطي الوسادة الإطارات فقط كتسلسل من الصور ، دون معلومات عن التأخيرات.
- في بعض الأحيان يتم تثبيت الإطارات الجزئية بشكل غير صحيح.
لذلك ، كان علي أن أبحث عن بديل. وحدة
gif2numpy تصرفت فيه. يتم "شحذها" لميزات GIF ويوفر الوصول إلى جميع الخصائص التقنية لكل من إطارات الصور والإطارات الفردية ، بما في ذلك
GCE . وبالتالي ، فهو يحل مشكلة التأخير في القراءة.
الشفافية ، كما اتضح فيما بعد ، لا يدعمها gif2numpy على الإطلاق: يتم تحويل الألوان على الفور إلى ثلاث قنوات ذات عمق البت في البايت ، دون مراعاة عمق البت وحفظ مؤشرات الألوان. لحسن الحظ ، تتكون الوحدة من ملف واحد ، لذلك لم يكن من الصعب إدراجها في المشروع وتعديلها عن طريق حجز اللون
#FE00FE
للشفافية.
مشكلة الإطار الجزئي لم تكن تافهة لحلها.
يحاول gif2numpy
تراكب هذه الإطارات على الإطار السابق ، إلا أنه لا يتحقق من معلمات التراكب ، ولهذا السبب لا تظهر النتيجة الصحيحة دائمًا. لكي لا
gifsicle
مع الأعلام ، تتم معالجة الصورة الأولية باستخدام
gifsicle
مع المفتاح -
--unoptimize
- يحول الإطارات الجزئية إلى إطارات كاملة. وفي الوقت نفسه ، يقودهم ذلك إلى استخدام لوحة الألوان العالمية ، مما يلغي الحاجة إلى معالجة اللون الشفاف بشكل منفصل عند استخدام لوحة الإطار الخاصة بك.
الضغط لي أصعب
المربعات جيدة ، ولكن مع مثل هذه القيود تحتاج إلى إظهار المزيد من الخيال ، وإلا فإن صور GIF المصغرة لن "تتسلل" إلى Telegram.
تم استخدام شيء مشابه لـ
RLE أولاً : يتم دمج المربعات المجاورة أفقياً من نفس اللون في مستطيل واحد.
يصل المقبل هو استغلال ميزات لوتي. نظرًا لأن كل طبقة لها وقت بداية ونهاية تعسفيان ، يمكنك تطبيق تقنية تم استخدامها منذ فترة طويلة بواسطة برامج ترميز الفيديو ، وجزئيًا في GIF نفسها: يمكن دمج المربعات التي تبقى في نفس المكان لعدة إطارات في طبقة واحدة ، يتم خلالها تغيير العرض العديد من الآخرين. الذي يتم تنفيذه حتى الآن فقط لأزواج من الطبقات المجاورة.
خطط التنمية
الأفكار التي يمكن تطبيقها هنا مجمعة:
مراجع
- المصادر . مخيف في الأماكن.
- القناة التي أحمل عليها حزم GIF المحولة بنجاح.