# كيف يعمل Resizo

## المعالجة داخل المتصفّح

عندما يُفلِت المستخدم صورةً على Resizo، يُقرأ الملف إلى الذاكرة باستخدام واجهتي `FileReader` و`Blob`. تُفكَّك الـ bitmap إلى `HTMLImageElement` أو `ImageBitmap`، وتُرسَم على `<canvas>` بالأبعاد المستهدفة، ثمّ يُعاد ترميزها عبر `canvas.toBlob()`. يُقدَّم الـ blob الناتج كملف للتنزيل عبر object URL. ولا يعبر الملف أيّ حدود شبكية البتّة.

أمّا في المهام الدفعية، فيستخدم Resizo تجمّعًا من `Web Worker` لمعالجة عدّة صور بالتوازي دون أن يُحجَب الواجهة، ثمّ يُجمِّع المخرجات في ملف ZIP باستخدام مُرمِّز ZIP على جانب العميل. ويُنشَأ الـ ZIP أيضًا في الذاكرة ويُنزَّل مباشرةً.

## نموذج الخصوصية

- **بدون رفع.** لا يوجد أيّ endpoint على جانب الخادم يستقبل بيانات صورة.
- **بدون استمرارية.** تبقى الصور في تبويب المتصفّح النشط فقط. وإغلاق التبويب أو تحديثه يمسحها.
- **بدون قياس عن بُعد على محتوى الملفّ.** لا يُرسِل Resizo أسماء الملفّات أو الأبعاد أو البيانات الوصفية إلى أيّ خدمة تحليلات.
- **يعمل دون اتصال.** بعد التحميل الأوّل للصفحة، يعمل الموقع مع فصل الشبكة.
- **سلوك مفتوح.** كلّ المعالجة هي JavaScript عادية ظاهرة في مصدر الصفحة؛ ويمكن التحقّق من نشاط الشبكة من خلال تبويب Network في DevTools (يبقى فارغًا أثناء التحرير).

## الصيغ المدعومة

| الصيغة | الإدخال | الإخراج | ملاحظات |
| --- | --- | --- | --- |
| JPG / JPEG | نعم | نعم | ضغط مع فقد. الأنسب للصور الفوتوغرافية. شريط الجودة 1–100. |
| PNG | نعم | نعم | دون فقد. يدعم الشفافية. ملفّات أكبر حجمًا. |
| WebP | نعم | نعم | صيغة حديثة، أصغر بنحو 25–35% من JPG عند الجودة نفسها. |
| GIF | نعم | لا (يُصدَّر بصيغة PNG/JPG/WebP) | يُستخدم أوّل إطار؛ ولا تُحفَظ الحركة. |
| HEIC / HEIF | يعتمد على المتصفّح | لا | Safari يفكّ الترميز بشكل أصيل؛ والمتصفّحات الأخرى تحتاج إلى تحويل مسبق. |
| SVG | لا | لا | صيغة متّجهة؛ وإعادة التحجيم تغييرٌ لـ viewBox، وليست عمليةً نقطية. |

## الجودة والاستيفاء (Interpolation)

تخضع إعادة التحجيم في Canvas API لإعدادَين يُتيحهما Resizo:

- `imageSmoothingEnabled` — يُضبَط على `true` للصور الفوتوغرافية لكي تُستوفى الحواف؛ ويُضبَط على `false` للـ pixel art ولقطات الشاشة للحفاظ على حدّة الحواف الحادّة.
- `imageSmoothingQuality` — قيمته الافتراضية `"high"`، وهي تختار نواة إعادة عيّنات من رتبة أعلى (يحدّدها تنفيذ المتصفّح، وعادةً ما تكون Lanczos أو bicubic). أمّا `"medium"` و`"low"` فتقايضان الجودة بالسرعة في المهام الدفعية الكبيرة.

ولعمليات التصغير الكبيرة (أكثر من ~3×)، يُجري Resizo إعادة التحجيم على مرحلتين للتقليل من الـ aliasing. وتستخدم مخرجات JPG وWebP قيمة جودة يتحكّم بها المستخدم؛ بينما يستخدم PNG ضغط DEFLATE دون فقد.
