Base64 ترميز وليس ضغطاً للصورة
يمثل Base64 القياسي كل ثلاثة بايتات بأربعة محارف؛ الطول الدقيق 4 × ceil(n / 3) والزيادة المستمرة تقارب 33.3%. ويضيف Data URL بادئة MIME.
تقلل الأداة بايتات الصورة أولاً: تفكها، وتغير الأبعاد أو الجودة أو الصيغة عند الحاجة، ثم تنشئ Base64 قياسياً من جديد.
ينتج Gzip نوعاً آخر من البيانات
ضغط Base64 بـ Gzip ينتج بيانات ثنائية يجب فكها قبل عرض الصورة. إعادة ترميزها لا تجعلها Data URL عادية لصورة.
JPEG وPNG وWebP صيغ مضغوطة أصلاً. قد يفيد تقليل البكسلات أو الجودة أو البيانات الوصفية أو تغيير الصيغة، دون ضمان الفقد الصفري أو الحجم الأصغر.
حجم مستهدف من دون نتيجة أكبر
يبحث JPEG وWebP عن الجودة ضمن عدد ثابت من المحاولات، ثم تقل الأبعاد في جولات محدودة مع حفظ النسبة.
إذا لم يقل عدد محارف Base64 القياسي تُحفظ البايتات الأصلية. ويُوضح عدم بلوغ هدف KB مع إرجاع أفضل نتيجة أصغر.
معالجة محلية وحدود واضحة
يبقى كل شيء في علامة التبويب: لا رفع ولا URL بعيد ولا قياس عن بعد ولا مكتبات صور. الحد 20 MiB و16 ميغابكسل.
تُرفض SVG وGIF وICO وWebP المتحركة لمنع التنفيذ أو فقد الإطارات. يحفظ Auto الشفافية؛ ويتطلب JPEG خلفية مؤكدة. Canvas ليس فحصاً للبرمجيات الخبيثة.
متى نتجنب Base64
يفيد للموارد الصغيرة المضمنة. الصور الكبيرة أنسب كـ Blob URL أو ملفات مستقلة أو رفع ثنائي للاستفادة من التخزين المؤقت والنقل.
تُقارن بايتات الصورة ومحارف Base64 منفصلة. إزالة بادئة data: لا تُحسب ضغطاً.
الأخطاء الشائعة التي تشرحها الأداة
- محارف Base64 أو padding أو الطول غير صالح.
- MIME المعلن لا يطابق magic bytes.
- أكثر من 20 MiB أو 16 ميغابكسل أو تعذر الفك.
- صورة متحركة أو متعددة الإطارات أو SVG أو محسنة مسبقاً.
أوامر مكافئة
استخدم بيئة التشغيل أو shell المتاح. تحقق من المدخلات غير الموثوقة ولا تطبع البيانات الثنائية مباشرة في الطرفية.
Python
from PIL import Image
from io import BytesIO
import base64
image = Image.open(BytesIO(base64.b64decode(value)))
out = BytesIO(); image.save(out, 'WEBP', quality=82)
result = base64.b64encode(out.getvalue()).decode('ascii')
JavaScript
const blob = new Blob([bytes], { type: mime });
const bitmap = await createImageBitmap(blob);
ctx.drawImage(bitmap, 0, 0, width, height);
const output = await new Promise(r => canvas.toBlob(r, 'image/webp', 0.82));
bitmap.close();
Shell
printf '%s' "$VALUE" | base64 --decode > input.png
magick input.png -resize '1920x1920>' -quality 82 output.webp
base64 --wrap=0 output.webp
المعايير والمراجع الرسمية
الأسئلة الشائعة عن ضغط صور Base64
هل يمكن ضغط Base64 نفسه؟
الضغط العام ينشئ صيغة ثنائية أخرى. للحفاظ على Base64 قياسي للصورة، حسّن البايتات ثم أعد الترميز.
هل يعمل الناتج مباشرة في img src؟
نعم. Raw هو Base64 قياسي وData URL بصيغة data:image/...;base64.
كيف أصل إلى 100 KB؟
اختر Custom و100 KB. البحث في الجودة والأبعاد محدود؛ قد لا تبلغ كل صورة الهدف.
هل تنخفض الجودة؟
قد تنخفض. تغيير الحجم وجودة JPEG/WebP بفقد؛ وقد لا يصغر PNG بعد إعادة الترميز.
لماذا يزيد Base64 نحو 33%؟
تتحول ثلاثة بايتات إلى أربعة محارف. الصيغة الدقيقة 4 × ceil(n / 3).
هل تُرفع الصورة؟
لا. التحليل وCanvas والمعاينة والنسخ والتنزيل كلها محلية.
Gzip قبل Base64 أم بعده؟
للنقل اضغط استجابة HTTP الخارجية عند الحاجة. لا يصلح Gzip كـ Data URL من دون فك.