شيفرة هذه الصفحة لم تبدأ العمل.

فتح index.html مباشرة من مجلد يمنع المتصفح من تحميل وحدات JavaScript، فلا يحدث شيء عند اختيار صورة. قدّم المجلد عبر HTTP بدلا من ذلك:

powershell -ExecutionPolicy Bypass -File serve.ps1

ثم افتح http://localhost:8080/.

الصورة إلى Data URI — رمِّز صورة بـ base64 لـ CSS أو HTML

الصورة كلها في سطر نصّ واحد. الصقه في CSS أو HTML مباشرة.

اللغة: العربية
عرض الشيفرة المصدرية
صورك لا تُرفع أبدا. لا يوجد خادم.

يجري الترميز داخل متصفحك أنت، على جهازك أنت. وهو حسابٌ على بايتات عند الصفحة أصلاً: لا مرمِّز، ولا خادم، ولا خطوة شبكية يمكن إغفالها. لا تملك هذه الأداة أي وظيفة شبكية على الإطلاق — لا شيء تجلبه ولا شيء ترسله — ولا يقف خلف هذه الصفحة خادم تُرسَل إليه صورة، حتى لو كان فيها ما يرسلها.

فحص حي: جارٍ الفحص…

دون اتصال: جارٍ الفحص…

لا داعي لأن تصدّقنا: افتح أدوات المطوّر، وراقب تبويب «الشبكة»، ثم أفلِت صورة. لن يحمل أي طلب صورةً ولا مصغَّرة ولا اسم ملف ولا بايتاً واحداً مما اخترته. أو اقطع الاتصال بالإنترنت ورمِّز صورة رغم ذلك.

1 اختر الصور

2 قل إلى أين ستذهب

الـ Data URI وحدها نادراً ما تكون مراد أحد. المراد هو السطر الذي يدخل في ورقة الأنماط — فاختر السطر، وتصلك الصورة داخله بين علامتَي اقتباس أصلاً، وهو الجزء الذي يسهل الخطأ فيه والذي لا يفشل إلا مع ملفات SVG.

نصّ alt متروك فارغاً عن قصد. فأنت وحدك تعرف هل تحمل الصورة معنى أم هي زينة، ووصفٌ مخمَّن من اسم ملف أسوأ لمن يستعمل قارئ شاشة من ألا يكون هناك وصف أصلاً.

رمِّز ملفات SVG بـ base64 كذلك مُطفأ افتراضياً، لأن ملف SVG نصّ وbase64 للبايتات. والترميز بالنسبة المئوية يُبقي الوسوم مقروءة في ورقة الأنماط وهو أقصر بنحو الخُمس عادةً. فعِّل هذا لسلسلة الأدوات النادرة التي تصرّ على ;base64.

SVG

3 انسخها

لم تختر شيئاً بعد. أفلِت صورة أعلاه فيظهر هنا السطر الذي تلصقه.

عرض بصيغة Markdown

كيف تحوِّل صورة إلى Data URI

  1. اختر صورك. أفلِتها على المُنتقي أو اخترها يدوياً. يقرؤها المتصفح من قرصك مباشرة، ولا يُرسَل شيء إلى أي مكان أثناء ذلك.
  2. قل إلى أين ستذهب النتيجة. الـ URI وحدها، أو قاعدة CSS، أو خاصية مخصّصة، أو وسم <img>، أو Markdown. وكل واحدة منها تضع الـ URI بين علامتَي اقتباس، وهي التفصيلة التي يسهل الخطأ فيها والتي لا تفشل إلا مع ملفات SVG.
  3. انظر ماذا كلّف ذلك. تقول كل نتيجة كم حرفاً صارت، وكم هي أكبر من الملف، وهل تضمين شيء بهذا الحجم فكرة صائبة. فـ base64 يضيف الثلث؛ وهل يستحق ذلك الثلثُ طلباً موفَّراً يتوقف كلياً على الحجم، فتقول لك الصفحة على أي جانب من الخط أنت.
  4. انظر في التحذيرات. إن كانت الصورة تحمل EXIF أو ملفَّ ألوان أو XMP، سُمّي ذلك ومعه كم بايتاً من نتيجتك هو. وإن خالف الامتداد الصيغةَ الحقيقية، أخذت الصفحة بالصيغة وأخبرتك. وإن عجز متصفحك عن رسم النتيجة، قالت ذلك أيضاً.
  5. انسخ، أو نزِّل. زرٌّ لكل نتيجة، وزرٌّ لها جميعاً دفعة واحدة — وتخرج الخصائص المخصّصة ملفوفة في كتلة :root، جاهزة للّصق في رأس ورقة الأنماط.

النسخة الأطول

متى تضع صورةً داخل ملف CSS ومتى لا تفعل ماذا يكلّف عنوانُ data URI، ولماذا يضيف base64 الثلثَ ولا يعيده gzip، ولماذا لا ينبغي أن يكون ملفُّ SVG بترميز base64 أبداً، وخطأُ التنصيص الذي يكسر ملفات SVG المضمَّنة بصمت.

أسئلة

هل تُرفع صورتي إلى أي مكان؟

لا. يقرأ متصفحك أنت الملف ويرمّزه على جهازك أنت، بدالّتين يملكهما المتصفح أصلاً. لا تملك هذه الأداة أي وظيفة شبكية على الإطلاق — فهي لا تجلب شيئاً ولا ترسل شيئاً — وContent-Security-Policy الخاصة بالصفحة تُسمّي كل عنوان يجوز لها الاتصال به، وليس واحد منها لنا.

ما الـ Data URI؟

طريقة في كتابة ملف كامل في الموضع الذي يوضع فيه عنوان الويب عادةً. فبدل url("logo.png")، التي تقول للمتصفح اذهب وأحضِر شيئاً، تكتب url("data:image/png;base64,iVBORw0...")، وهي تحوي الصورة نفسها. فيفكّ المتصفح ترميزها في مكانها. والأثر العملي طلبٌ أقل: تصل الصورة مع ورقة الأنماط أو الصفحة بدل أن تصل بعدها.

لماذا لم يُرمَّز ملف SVG بـ base64؟

لأن base64 هو الترميز الخطأ له. فملف SVG نصّ، والعنوان يستطيع حمل النصّ أصلاً — ولا يحتاج إلى الهروب إلا حفنة من المحارف. وترميزُ تلك بالنسبة المئوية وتركُ ما عداها ينتج URI أقصر بنحو الخُمس من base64 للملف نفسه، وتظل تستطيع قراءتها في ورقة أنماطك: أسماء العناصر والألوان وviewBox كلها باقية للتعديل. وثمّة مربع اختيار لفرض base64 لسلسلة الأدوات النادرة التي تصرّ عليه.

كم يكبّر base64 صورتي؟

الثلث تقريباً. ثلاث بايتات من الملف تصير أربعة محارف من base64، أي 33% قبل data:image/png;base64, التي في المقدمة. وهذا هو الحدّ الأدنى، ولا مفرّ منه: فهو ثمن كتابة بايتات كيفما كانت بالمحارف التي يسمح بها العنوان لا غير. وهو أيضاً سبب عرض الصفحة عددَ المحارف بجانب حجم الملف بدل أن تتركك تكتشفه حين تُنشَر ورقة الأنماط.

متى يكون تضمين صورة فكرة صائبة فعلاً؟

حين تكون صغيرة والحاجة إليها فورية. فأيقونة بحجم 2 KB في ورقة أنماط تحمّلها كل صفحة مكسبٌ بيّن: رحلة ذهاب وإياب أقل، والصورة حاضرة لحظةَ حضور الـ CSS. وبعد نحو 10 KB ينقلب الميزان. فالصورة المضمَّنة لم تعد ملفاً منفصلاً، فلا يمكن تخبئتها وحدها، ولا جلبها بالتوازي مع غيرها، وتُنزَّل كاملة من جديد كلما تغيّر الملف الذي حولها — وصورة فوتوغرافية بحجم 200 KB في ورقة أنماط هي 200 KB مضافة إلى المسار الحرج لكل صفحة في الموقع. وتقول لك الصفحة على أي جانب من ذلك الخط تقع كل نتيجة.

هل يُلغي gzip زيادةَ base64؟

أقلّ مما يتوقّع الناس. فـ base64 لملف مضغوط أصلاً — وهو حال PNG وJPEG وWebP جميعاً — ينضغط ضغطاً رديئاً، لأنه لم يبقَ فيه من التكرار ما يجده الضاغط؛ فتستعيد عادةً شيئاً كعُشر الثلث الذي أضافه base64، لا الثلث كله. أما ملف SVG المرمَّز بالنسبة المئوية فالحال فيه عكس ذلك: هو نصّ بعد، فينضغط كما كان ينضغط تقريباً، وهذا سبب آخر لألا ترمّزه بـ base64.

هل يغيّر هذا صورتي أصلاً؟

لا، وهذا فرق مقصود عن معظم الأدوات هنا. فلا شيء يُفكّ ترميزه إلى بكسلات ويُعاد ترميزه: البايتات التي خرجت من قرصك هي البايتات التي تدخل في الـ URI. فيبقى ملف JPEG هو ملف JPEG نفسه بالضبط، بالجودة نفسها والأبعاد نفسها. وهو السبب في أن الناتج يمكن وصفه بأنه الملف نفسه لا نسخة منه.

إذن تذهب بيانات EXIF وGPS إلى ورقة الأنماط أيضاً؟

نعم، وهذا هو الجزء الجدير بالتفكير قبل اللصق. فلأن لا شيء يُعاد ترميزه، يسافر مع الصورة كلُّ ما كتبته الكاميرا: الموقع، والوقت، والرقم التسلسلي للكاميرا. وفي صورة من هاتف قد يكون ذلك 30 KB من الملف، تصير 40 KB من base64 على المسار الحرج لصفحتك، وعنوانَ منزل في شيء سيُودَع في مستودع. وهذه الصفحة تقرأ كم من البيانات الوصفية في ملف JPEG أو PNG أو WebP وتقوله. ولإخراجها أولاً، استخدم عارض EXIF ومُزيله.

لماذا استخدم نوعاً غير امتداد ملفي؟

لأن الامتداد قد يكون خطأً والبايتات لا تكون. فملفٌ اسمه logo.png وقد صُدِّر في الحقيقة JPEG أمرٌ شائع بما يكفي لأن تضطر كل أداة صور إلى التعامل معه، والـ Data URI التي تعلن النوع الخطأ لا تظهر ببساطة — لا بديل ولا رسالة خطأ تستحق القراءة. فيُقرأ النوع من أول بايتات الملف، وهي تقول ما هو قولاً قاطعاً في كل صيغة هنا، وتخبرك الصفحة حين يختلف الاثنان.

المعاينة فارغة. ما الذي حدث؟

على الأرجح لا شيء يخصّ الـ URI. فـ HEIC وTIFF كلتاهما تنتج Data URI صحيحة تماماً لا يرسمها متصفح غير Safari، فالصورة غائبة حيثما لصقتها كذلك — حوِّلها إلى PNG أو JPEG أو WebP أولاً بـ ضاغط الصور أو أداة تغيير حجم الصور. وإن كانت الصيغة من الصيغ المعتادة، فالأرجح أن الملف نفسه معطوب: فالمعاينة مرسومة من الـ URI التي بنتها هذه الصفحة، وفراغها يعني أن الصورة لم يُفكّ ترميزها.

هل ثمّة حدّ لحجم الـ Data URI؟

ليس حداً ستلقاه في CSS ولا في وسم <img>؛ فالمتصفحات الحديثة لا تفرض هناك سقفاً عملياً. أما ما تحدّه المتصفحات فعلاً فهو كتابة Data URI في شريط العنوان، وهو ما ترفضه أكثرها الآن لأي شيء غير تافه، لأسباب أمنية لا علاقة لها بهذا الاستعمال. والحدّ الحقيقي هو الذي سبق: فقبل أن ينكسر شيء تقني بمدة طويلة، تكون الصفحة التي هو فيها قد صارت أبطأ مما كانت ستكون بملف صورة عادي.

هل هو مجاني، وهل أحتاج إلى حساب؟

هو مجاني، ولا حساب ولا تسجيل دخول ولا فترة تجريبية ولا علامة مائية. ولا حدّ لعدد الملفات ولا لأحجامها كذلك، إذ لا خادم يدفع ثمنها — فالعمل يجري على جهازك أنت. ويحمل الموقع إعلانات، وهي ما يدفع تكاليفه؛ ولا يُعطى المعلنون شيئاً عن صورك.

هل يعمل دون اتصال؟

نعم. حمِّل الصفحة مرة، ثم اقطع اتصالك بالإنترنت وستظل تعمل. وهذه أيضاً أبسط طريقة لإثبات أنه لا يُرفع شيء: فأداةٌ ترسل صورك بعيداً لتُرمَّز كانت ستتوقف في اللحظة التي تقطع فيها الاتصال.