تبدیل تصویر داخل مرورگر واقعاً چطور کار میکند (و چرا اینطور ساختمش)
Dov Azencot
@DovAzencotدلیل وجود کل این سایت یک لحظهٔ کوچک و احمقانهٔ ناراحتی است که سالها پیش داشتم. لازم بود یک عکس HEIC را به JPG تبدیل کنم، چیز بدیهی را در نوار جستجو تایپ کردم، و روی مبدلی فرود آمدم که میخواست عکسم را به سرورش آپلود کنم. پس کردم. کار کرد. و بعد آنجا نشستم و فکر کردم: آن عکس حالا روی ماشینی نشسته که هیچ چیزی دربارهاش نمیدانم، به دست آدمهایی که هرگز نمیبینمشان، برای مدتی که هرگز به من گفته نشد. برای یک اسکرینشات تصادفی، اشکالی ندارد. اما آن یک اسکرینشات نبود. یک عکس شخصی بود، و من همین حالا آن را به غریبهها داده بودم تا سی ثانیه در وقتم صرفهجویی کنم.
مشکلی که راه افتادم تا دیگر نداشته باشمش همین بود. پاسخ از کار درآمد که آپلود اصلاً از همان اول لازم نبوده.
راه قدیمی: کامپیوتر یک غریبه را اجاره کن
یک مبدل آنلاین سنتی مثل یک سرویس پستی کار میکند. فایلتان را بالا میفرستید به یک سرور. سرور تبدیل را با نرمافزار نصبشده روی ماشین خودش اجرا میکند. نتیجه را پایین میفرستد. تصویر شما یک رفتوبرگشت از سختافزاری که کنترلش دست شما نیست انجام داد، و جایی وسط راه، بهتمامی، روی دیسکی که مال شما نیست نشست.
هر وعدهٔ حریم خصوصی که به آن مدل پیچ شده، وعدهای دربارهٔ رفتار است — فایل بعد از یک ساعت پاک میشود، کسی نگاه نمیکند. شاید این پابرجا بماند. شاید بماند. هیچ راهی برای بررسی ندارید، و دارید بایتهای واقعی فایلتان را به آن میسپارید. اعتماد کل معماری است، و اعتماد دقیقاً همان چیزی بود که نمیخواستم خرجش کنم.
راه تازه: مرورگر شما از قبل کامپیوتر را دارد
چیزی که عوض شد این است. مرورگرهای مدرن میتوانند برنامههای واقعی و کامپایلشده را با سرعتی نزدیک به بومی اجرا کنند، از طریق چیزی به نام WebAssembly — بهاختصار WASM. کدکهای تصویری که پیشتر روی سرور زندگی میکردند — کدی که یک PNG را میخواند، که یک WebP را کدگذاری میکند، که HEIC را رمزگشایی میکند — میتوانند به WASM کامپایل شوند و داخل همان تب مرورگری که از قبل باز دارید اجرا شوند.
پس وقتی فایلی را روی صفحهای که اینطور ساخته شده رها میکنید، نرمافزار تبدیل یکبار روی ماشین شما دانلود میشود، مثل هر بخش دیگر صفحهٔ وب. از آن پس کار واقعی — خواندن تصویرتان، ترنسکد کردنش، نوشتن فایل تازه — روی پردازندهٔ خودتان، در حافظهٔ خودتان رخ میدهد. نتیجه مستقیماً بهصورت یک دانلود به خودتان تحویل داده میشود. فایل شما هرگز جایی فرستاده نمیشود، چون جایی برای فرستادنش نیست. اصلاً هیچ سروری در مدار نیست.
برای همین میتوانم بگویم فایلهای شما هرگز دستگاهتان را ترک نمیکنند و آن را یک واقعیت بدانم نه یک سیاست. این نیست که قول میدهم نگاه نکنم. این است که هیچ مسیری نیست که تصویر شما از راهش به من برسد. نمیتوانستم عکستان را حتی اگر دادگاهی حکمش را میداد بازیابی کنم، چون هرگز طرف من از سیم نبود. حریم خصوصی ویژگیای نیست که رویش اضافه کرده باشم. پیامد جایی است که کد اجرا میشود.
چطور میتوانید بفهمید که درست است
لازم نیست حرف مرا باور کنید، و این همان بخشی است که بیش از همه دوستش دارم. ابزار توسعهدهندهٔ مرورگرتان را باز کنید، تب شبکه را تماشا کنید، و یک فایل تبدیل کنید. خواهید دید که صفحه و کدک WASM یکبار دانلود میشوند. نخواهید دید که تصویرتان بالا برود. بهتر از آن: صفحه را بارگذاری کنید، وایفای را خاموش کنید، و باز هم چیزی را تبدیل کنید. هنوز کار میکند، چون هر چه لازم دارد از قبل روی ماشین شماست. ابزاری که فایلهایتان را آپلود میکند نمیتواند این کار را بکند. این یکی میتواند.
آن یک محدودیت واقعی
قول صداقت داده بودم، پس این هم از آن. اجرای تبدیل روی دستگاه خودتان یعنی از حافظهٔ خودتان استفاده میکند، و یک تب مرورگر حافظهٔ بینهایت برای بازی ندارد.
برای فایلهای عادی — عکسها، اسکرینشاتها، لوگوها، همان چیزهایی که مردم تمام روز تبدیل میکنند — این اصلاً مسئلهای نیست. اما اگر چیزی واقعاً عظیم را به آن بدهید، یک تصویر تکی با رزولوشن افراطی، یا یک دستهٔ بزرگ یکجا، میتوانید به سقف بخورید. رمزگشایی یک تصویر یعنی نگهداشتن پیکسلهای فشردهنشدهاش در حافظه، که بسیار بزرگتر از فایل روی دیسک است، و یک تصویر غولآسا میتواند آنچه را به تب اجازه داده شده به ته برساند. وقتی این اتفاق میافتد، تبدیل به خزیدن کند میشود یا تب دست میکشد.
سروری با 64 گیگابایت رم هرگز این مشکل را ندارد. پس این هم معامله، صریح: یک مبدل سمتسرور میتواند فایلهایی بزرگتر از آنچه دستگاه شما اصلاً از پسش برمیآید را بجود. این رویکرد نمیتواند. چیزی که در ازایش به شما میدهد این است که فایل شما هرگز از دستتان بیرون نمیرود. برای اکثریت قاطع آنچه مردم واقعاً تبدیل میکنند، این معاملهای است که بی هیچ درنگی ارزش انجام دارد. برای یک فایل هیولای نادر، محدودیتی واقعی است، و ترجیح میدهم بگویمش تا اینکه وانمود کنم وجود ندارد.
چرا هنوز فکر میکنم این پیشفرض درست است
بیشتر تبدیلها فایلهای معمولیاند که از همان اول هیچ نیازی نداشتند به سروری دست بزنند. آپلود همیشه تهماندهٔ دورانی بود که مرورگرها نمیتوانستند این کار را خودشان انجام دهند. حالا میتوانند. پس پیشفرض عاقلانه برعکس شد: فایل را روی ماشین خودتان نگه دارید، کار را محلی انجام دهید، و فقط در فرصت نادری که سختافزار خودتان واقعاً از پسش برنمیآید سراغ سرور بروید.
کل ایدهٔ پشت همهٔ آنچه اینجاست همین است. همان سایتی است که برای خودم ساختم بعد از آن یک بعدازظهر ناراحتکننده، تا دیگر هرگز مجبور نشوم فقط برای عوض کردن پسوند یک فایل، یک عکس شخصی را به یک غریبه بسپارم. معلوم شد هیچوقت مجبور نبودم. شما هم نیستید.
نوشتههای مرتبط
چرا PNG را به WebP تبدیل میکنم (و آن یک باری که نمیکنم)
PNG برای ویرایش قالبی درخشان است و برای انتشار قالبی پرخرج. اینجا میگویم WebP واقعاً چه چیزی برایتان صرفهجویی میکند، کجا هیچ صرفهای ندارد، و آن تکقاعدهای که هرگز نمیشکنم.
PNG یا JPG؟ قاعدهٔ دهسالهای که برای تصمیم به کار میبرم
بدون اتلاف در برابر بااتلاف، لبهها در برابر عکسها، شفافیت در برابر بدون شفافیت. یک پرسش ساده به شما میگوید هر فایل باید چه قالبی باشد — با جدول حجم واقعی که ثابتش کند.
چرا عکسهای آیفون شما HEIC هستند (و کِی بهتر است JPG کنید)
HEIC واقعاً قالبی بهتر است که نیمی از وب هنوز نمیتواند بازش کند. اینجا میگویم چرا اپل سراغش رفت، با تبدیل به JPG واقعاً چه چیزی از دست میدهید، و کِی خودم زحمتش را به خود نمیدهم.
همهٔ نوشتهها