توسعه برنامه GIF – نحوه توسعه رمزگذاری GIF

Summarize this content to 400 words in Persian Lang
در این مقاله، به طور خلاصه کتابخانههایی را فهرست میکنیم که میتوانند به شما در رمزگذاری فایلهای GIF که بخش مهمی از فرآیند توسعه اپلیکیشن GIF-maker است، کمک کنند. توجه داشته باشید که پروژه ها به طور مداوم در حال تغییر هستند، برخی از آنها منسوخ می شوند، و برخی دیگر ظاهر می شوند.
چرا رمزگذاری GIF اینقدر پیچیده است؟
ممکن است به نظر برسد که ساختن فایل GIF از توالی تصاویر درست مانند ساخت یک فایل ویدیویی است، فقط فرمت آن متفاوت است. خوب، هیچ چیز نمی تواند دور از حقیقت باشد! به خاطر داشته باشید که فرمت GIF در سال 1987 توسعه یافته است، بیش از 30 سال پیش و در آغاز، حتی از انیمیشن ها پشتیبانی نمی کرد. به همین دلیل محدودیت هایی دارد که رمزگذاری را کمی سخت تر می کند.
پالت
مهم ترین مسئله این است که یک قاب GIF ممکن است تا 256 رنگ داشته باشد (از جمله شفاف در صورت استفاده). عکس فوری قابل مشاهده در لحظه معین ممکن است از چندین فریم تشکیل شده باشد. به این دلیل که یک قاب ممکن است اندازه کوچکتر از کل بوم داشته باشد. علاوه بر این، یک فریم ممکن است حاوی پیکسل های شفاف باشد. اگر بخواهیم فریمی را که بیش از 256 رنگ دارد رمزگذاری کنیم، باید به نحوی آن را تبدیل کنیم. چند راه برای مقابله با این موضوع وجود دارد، برخی از آنها ممکن است ترکیب شوند.
یکی از آنها است پریشان. به طور کلی، رنگ های میانی را با مخلوط کردن رنگ های متمایزتر شبیه سازی می کند. نمونه ای از آن را در تصویر زیر مشاهده می کنید. توجه داشته باشید که یک تصویر فقط از پیکسل های کاملا سیاه و کاملا سفید تشکیل شده است. با این حال، پراکندگی توهم مقیاس خاکستری را به وجود می آورد.
تصویر تنها دارای پیکسل های سیاه و سفید با پراکندگی است
اگر همه فریم ها را می توان ذخیره کرد (چه در حافظه و چه در قالبی مانند یک فایل ویدیویی)، ابتدا می توانیم همه آنها را مرور کنیم، بررسی کنیم که کدام رنگ ها و تعداد دفعات آنها استفاده شده است (هیستوگرام ایجاد کنیم)، و یک پالت (های) بهینه بسازیم. ). چند راه برای ایجاد چنین هیستوگرام هایی وجود دارد. به عنوان مثال، فیلتر پالتژن FFmpeg از 3 حالت آماری مختلف پشتیبانی می کند.
هر فریم GIF ممکن است پالت مخصوص به خود را داشته باشد (اگر اینطور نباشد، از یک پالت جهانی استفاده می شود). با پالت های جداگانه می توانیم رنگ های بیشتری در کل فایل داشته باشیم. با این حال، چندین پالت فضای ذخیره سازی و زمان بیشتری را برای رمزگشایی مصرف می کنند. بسته به طول انیمیشن، اندازه بوم، و استفاده ممکن است معنی دار باشد یا نباشد. میتوانید در مقاله مربوط به رمزگذاری GIF با کیفیت بالا، در مورد آن بیشتر بخوانید.
توجه داشته باشید که فرمت GIF فقط از شفافیت پشتیبانی می کند (بیت آلفا – پیکسل ها می توانند کاملاً شفاف یا کاملاً مات باشند)، نه شفاف (کانال آلفا – سطح شفافیت ریز دانه). این بدان معناست که اگر منبع شما حاوی پیکسل های شفاف باشد، در فایل GIF خروجی به صورت شفاف یا مات ظاهر می شوند. به تصاویر زیر نگاه کنید:
فایل PNG با شفافیت – منبع
همان تصویر به GIF تبدیل شد
جدول زمانی
هر فریم می تواند تاخیر خاص خود را داشته باشد. زمانی است که یک فریم نمایش داده می شود. تاخیر بر حسب سانتیثانیه (1 واحد = 0.01 ثانیه) اندازهگیری میشود. 100 FPS عالی به نظر می رسد. با این حال، با توجه به این واقعیت که رمزگشایی GIF به طور کلی در مقایسه با ویدیو (که اغلب با سرعت سختافزاری تسریع شده است) کند است، محدودیتها معرفی شدند. کمترین مقادیر (کوتاهترین تاخیرها) به طور مصنوعی به مقادیر بالاتر افزایش می یابد. چه بیشتر، مقدار پس از افزایش معمولاً حداقل یک نیست بلکه چیزی حتی بالاتر است!
به عنوان مثال در محیط نوشتن این مقاله، به طور موثر حداقل تاخیر 0.02 ثانیه است. هر چیزی کوچکتر به 0.01 ثانیه افزایش یافته است. انیمیشن های زیر را ببینید:
GIF با تاخیر 0.01 ثانیه (ممکن است مانند 0.1 ثانیه قابل مشاهده باشد)
GIF با تاخیر 0.02 ثانیه
همچنین برای مثالهای بیشتر در مرورگرهای مختلف، مطالعه سازگاری مرورگر با تاخیر حداقل فریم GIF متحرک (که منبعی از تصاویر بالا نیز هست) را ببینید. ممکن است به کپی آرشیو وب علاقه مند باشید زیرا تصاویر در وب سایت اصلی مرده اند. انتخاب حداقل مقدار کار آسانی نبود.
اندروید
دستگاههایی که اندروید را اجرا میکنند (عمدتاً گوشیهای هوشمند و تبلتها)، معمولاً نسبت به رایانههای شخصی که همزمان استفاده میشوند، سختافزار عملکرد کمتری دارند، بنابراین بهینهسازیها در اینجا معنای مهمی دارند. این به این معنی است که رمزگذاری GIF در برنامه های اندروید معمولاً به صورت بومی انجام می شود (با استفاده از C/C++ و JNI، نباید با برنامه های بومی – غیر هیبریدی و غیر فلاتر اشتباه گرفته شود).
خوشبختانه، وقتی رمزگذاری GIF را در برنامه خود توسعه میدهید، همیشه لازم نیست به سطح پایینی از انتزاع بروید. یکی از محبوب ترین کتابخانه ها برای رمزگذاری تصویر/فیلم، FFmpeg است. نسخه مناسب برای توسعه دهندگان اندروید به طور رسمی ارائه نشده است. با این حال، برخی از لفاف ها وجود دارند. در زمان نوشتن یکی از محبوب ترین آنها Mobile FFmpeg است. هنگامی که می خواهید GIF را از منبع ورودی تولید کنید، احتمالاً چیزی شبیه به این تمام چیزی است که به آن نیاز دارید.
اگر میخواهید برخی از ویژگیهای خاص GIF مانند روشهای دفع در فریمهای جداگانه را دستکاری کنید یا ابرداده فایل GIF را تغییر دهید، ممکن است به gifsicle علاقه مند باشید. متأسفانه، نه باندهای رسمی اندروید دارد و نه یک پورت غیر رسمی شناخته شده. باید آن را از منبع کامپایل کنید.
بسته شدن
رمزگذاری GIF فرآیند آسانی نیست. با توجه به اینکه GIF برای انیمیشن های مدرن طراحی نشده است، برای رسیدن به نتایج رضایت بخش باید از تکنیک های بسیار پیچیده استفاده کنیم. خوشبختانه نیازی نیست همه چیز را از ابتدا بنویسیم. این موضوع به اندازه کافی محبوب است، بنابراین کتابخانه های آماده ای وجود دارد که می توان حداقل از قسمت های سطح پایین برنامه استفاده کرد. همچنین یک مقاله توسعه برنامه GIF – چالشها و نکات را بخوانید و GIPHY Cam – برنامهای برای ایجاد و اشتراکگذاری فایلهای GIF که ما توسعه دادهایم را بررسی کنید.
پست توسعه اپلیکیشن GIF – نحوه توسعه رمزگذاری GIF اولین بار در Droids On Roids ظاهر شد.
در این مقاله، به طور خلاصه کتابخانههایی را فهرست میکنیم که میتوانند به شما در رمزگذاری فایلهای GIF که بخش مهمی از فرآیند توسعه اپلیکیشن GIF-maker است، کمک کنند. توجه داشته باشید که پروژه ها به طور مداوم در حال تغییر هستند، برخی از آنها منسوخ می شوند، و برخی دیگر ظاهر می شوند.
چرا رمزگذاری GIF اینقدر پیچیده است؟
ممکن است به نظر برسد که ساختن فایل GIF از توالی تصاویر درست مانند ساخت یک فایل ویدیویی است، فقط فرمت آن متفاوت است. خوب، هیچ چیز نمی تواند دور از حقیقت باشد! به خاطر داشته باشید که فرمت GIF در سال 1987 توسعه یافته است، بیش از 30 سال پیش و در آغاز، حتی از انیمیشن ها پشتیبانی نمی کرد. به همین دلیل محدودیت هایی دارد که رمزگذاری را کمی سخت تر می کند.
پالت
مهم ترین مسئله این است که یک قاب GIF ممکن است تا 256 رنگ داشته باشد (از جمله شفاف در صورت استفاده). عکس فوری قابل مشاهده در لحظه معین ممکن است از چندین فریم تشکیل شده باشد. به این دلیل که یک قاب ممکن است اندازه کوچکتر از کل بوم داشته باشد. علاوه بر این، یک فریم ممکن است حاوی پیکسل های شفاف باشد. اگر بخواهیم فریمی را که بیش از 256 رنگ دارد رمزگذاری کنیم، باید به نحوی آن را تبدیل کنیم. چند راه برای مقابله با این موضوع وجود دارد، برخی از آنها ممکن است ترکیب شوند.
یکی از آنها است پریشان. به طور کلی، رنگ های میانی را با مخلوط کردن رنگ های متمایزتر شبیه سازی می کند. نمونه ای از آن را در تصویر زیر مشاهده می کنید. توجه داشته باشید که یک تصویر فقط از پیکسل های کاملا سیاه و کاملا سفید تشکیل شده است. با این حال، پراکندگی توهم مقیاس خاکستری را به وجود می آورد.
تصویر تنها دارای پیکسل های سیاه و سفید با پراکندگی است
اگر همه فریم ها را می توان ذخیره کرد (چه در حافظه و چه در قالبی مانند یک فایل ویدیویی)، ابتدا می توانیم همه آنها را مرور کنیم، بررسی کنیم که کدام رنگ ها و تعداد دفعات آنها استفاده شده است (هیستوگرام ایجاد کنیم)، و یک پالت (های) بهینه بسازیم. ). چند راه برای ایجاد چنین هیستوگرام هایی وجود دارد. به عنوان مثال، فیلتر پالتژن FFmpeg از 3 حالت آماری مختلف پشتیبانی می کند.
هر فریم GIF ممکن است پالت مخصوص به خود را داشته باشد (اگر اینطور نباشد، از یک پالت جهانی استفاده می شود). با پالت های جداگانه می توانیم رنگ های بیشتری در کل فایل داشته باشیم. با این حال، چندین پالت فضای ذخیره سازی و زمان بیشتری را برای رمزگشایی مصرف می کنند. بسته به طول انیمیشن، اندازه بوم، و استفاده ممکن است معنی دار باشد یا نباشد. میتوانید در مقاله مربوط به رمزگذاری GIF با کیفیت بالا، در مورد آن بیشتر بخوانید.
توجه داشته باشید که فرمت GIF فقط از شفافیت پشتیبانی می کند (بیت آلفا – پیکسل ها می توانند کاملاً شفاف یا کاملاً مات باشند)، نه شفاف (کانال آلفا – سطح شفافیت ریز دانه). این بدان معناست که اگر منبع شما حاوی پیکسل های شفاف باشد، در فایل GIF خروجی به صورت شفاف یا مات ظاهر می شوند. به تصاویر زیر نگاه کنید:
فایل PNG با شفافیت – منبع
همان تصویر به GIF تبدیل شد
جدول زمانی
هر فریم می تواند تاخیر خاص خود را داشته باشد. زمانی است که یک فریم نمایش داده می شود. تاخیر بر حسب سانتیثانیه (1 واحد = 0.01 ثانیه) اندازهگیری میشود. 100 FPS عالی به نظر می رسد. با این حال، با توجه به این واقعیت که رمزگشایی GIF به طور کلی در مقایسه با ویدیو (که اغلب با سرعت سختافزاری تسریع شده است) کند است، محدودیتها معرفی شدند. کمترین مقادیر (کوتاهترین تاخیرها) به طور مصنوعی به مقادیر بالاتر افزایش می یابد. چه بیشتر، مقدار پس از افزایش معمولاً حداقل یک نیست بلکه چیزی حتی بالاتر است!
به عنوان مثال در محیط نوشتن این مقاله، به طور موثر حداقل تاخیر 0.02 ثانیه است. هر چیزی کوچکتر به 0.01 ثانیه افزایش یافته است. انیمیشن های زیر را ببینید:
GIF با تاخیر 0.01 ثانیه (ممکن است مانند 0.1 ثانیه قابل مشاهده باشد)
GIF با تاخیر 0.02 ثانیه
همچنین برای مثالهای بیشتر در مرورگرهای مختلف، مطالعه سازگاری مرورگر با تاخیر حداقل فریم GIF متحرک (که منبعی از تصاویر بالا نیز هست) را ببینید. ممکن است به کپی آرشیو وب علاقه مند باشید زیرا تصاویر در وب سایت اصلی مرده اند. انتخاب حداقل مقدار کار آسانی نبود.
اندروید
دستگاههایی که اندروید را اجرا میکنند (عمدتاً گوشیهای هوشمند و تبلتها)، معمولاً نسبت به رایانههای شخصی که همزمان استفاده میشوند، سختافزار عملکرد کمتری دارند، بنابراین بهینهسازیها در اینجا معنای مهمی دارند. این به این معنی است که رمزگذاری GIF در برنامه های اندروید معمولاً به صورت بومی انجام می شود (با استفاده از C/C++ و JNI، نباید با برنامه های بومی – غیر هیبریدی و غیر فلاتر اشتباه گرفته شود).
خوشبختانه، وقتی رمزگذاری GIF را در برنامه خود توسعه میدهید، همیشه لازم نیست به سطح پایینی از انتزاع بروید. یکی از محبوب ترین کتابخانه ها برای رمزگذاری تصویر/فیلم، FFmpeg است. نسخه مناسب برای توسعه دهندگان اندروید به طور رسمی ارائه نشده است. با این حال، برخی از لفاف ها وجود دارند. در زمان نوشتن یکی از محبوب ترین آنها Mobile FFmpeg است. هنگامی که می خواهید GIF را از منبع ورودی تولید کنید، احتمالاً چیزی شبیه به این تمام چیزی است که به آن نیاز دارید.
اگر میخواهید برخی از ویژگیهای خاص GIF مانند روشهای دفع در فریمهای جداگانه را دستکاری کنید یا ابرداده فایل GIF را تغییر دهید، ممکن است به gifsicle علاقه مند باشید. متأسفانه، نه باندهای رسمی اندروید دارد و نه یک پورت غیر رسمی شناخته شده. باید آن را از منبع کامپایل کنید.
بسته شدن
رمزگذاری GIF فرآیند آسانی نیست. با توجه به اینکه GIF برای انیمیشن های مدرن طراحی نشده است، برای رسیدن به نتایج رضایت بخش باید از تکنیک های بسیار پیچیده استفاده کنیم. خوشبختانه نیازی نیست همه چیز را از ابتدا بنویسیم. این موضوع به اندازه کافی محبوب است، بنابراین کتابخانه های آماده ای وجود دارد که می توان حداقل از قسمت های سطح پایین برنامه استفاده کرد. همچنین یک مقاله توسعه برنامه GIF – چالشها و نکات را بخوانید و GIPHY Cam – برنامهای برای ایجاد و اشتراکگذاری فایلهای GIF که ما توسعه دادهایم را بررسی کنید.
پست توسعه اپلیکیشن GIF – نحوه توسعه رمزگذاری GIF اولین بار در Droids On Roids ظاهر شد.