ما المقاسات التي يجب أن يحتويها ملف favicon.ico؟
16 و32 و48 بكسل تغطي هذه المقاسات الثلاثة تبويب المتصفح ومبدّل Alt-Tab وسطح المكتب، وهي المجموعة الموصى بها منذ 1995. ولا تُضِف 256 إلا إذا كان على الأيقونة أن تصمد أيضاً في عرض الأيقونات الكبيرة.
حوّل PNG أو JPG أو SVG أو WebP إلى ملف .ico حقيقي متعدد المقاسات: 16 و32 و48 بكسل في ملف واحد مع حفظ قناة ألفا كاملة. اختر التخزين بصيغة PNG أو BMP غير مضغوط وشاهد الحجمين. ويفتح ملفات .ico أيضاً.
أسقط صورة هنا أو انقر للتصفح
PNG أو JPG أو SVG أو WebP أو GIF أو BMP · حتى 10 ميجابايت
كلاهما مشروع داخل ملف .ico. وقد صار Windows يقرأ PNG منذ Vista وتقرؤه كل المتصفحات الحالية؛ أما BMP غير المضغوط فتستخدمه فعلاً 13 من أصل 14 ملف ICO حقيقي عُثر عليها في 20 موقعاً جرى فحصها، لأن ImageMagick يحوّل إليه افتراضياً.
<link rel="icon" href="/favicon.ico" sizes="16x16 32x32 48x48"> <link rel="icon" type="image/svg+xml" href="/icon.svg"> <link rel="apple-touch-icon" href="/apple-touch-icon.png">
أسقط ملف .ico هنا أو انقر للتصفح
يُدرَج كل مقاس داخل الملف على حدة
| الإزاحة | البايتات | الحقل | القيمة |
|---|---|---|---|
| 0 | 2 | idReserved | 0 |
| 2 | 2 | idType | 1 |
| 4 | 2 | idCount | 3 |
| 6 | 1 | bWidth[0] | 16 → 16 |
| 7 | 1 | bHeight[0] | 16 → 16 |
| 8 | 1 | bColorCount[0] | 0 |
| 9 | 1 | bReserved[0] | 0 |
| 10 | 2 | wPlanes[0] | 1 |
| 12 | 2 | wBitCount[0] | 32 |
| 14 | 4 | dwBytesInRes[0] | 248 |
| 18 | 4 | dwImageOffset[0] | 54 |
| 22 | 1 | bWidth[1] | 32 → 32 |
| 23 | 1 | bHeight[1] | 32 → 32 |
| 24 | 1 | bColorCount[1] | 0 |
| 25 | 1 | bReserved[1] | 0 |
| 26 | 2 | wPlanes[1] | 1 |
| 28 | 2 | wBitCount[1] | 32 |
| 30 | 4 | dwBytesInRes[1] | 720 |
| 34 | 4 | dwImageOffset[1] | 302 |
| 38 | 1 | bWidth[2] | 48 → 48 |
| 39 | 1 | bHeight[2] | 48 → 48 |
| 40 | 1 | bColorCount[2] | 0 |
| 41 | 1 | bReserved[2] | 0 |
| 42 | 2 | wPlanes[2] | 1 |
| 44 | 2 | wBitCount[2] | 32 |
| 46 | 4 | dwBytesInRes[2] | 1464 |
| 50 | 4 | dwImageOffset[2] | 1022 |
كتبه وراجعه المطوّرون الذين يبنون أدوات التحويل في Go Tools. وبنية الحاوية وأعداد البايتات وأشكال الفشل الموصوفة هنا مصدرها مراجعة مكتوبة للمجال، لا ملخّصات الآخرين عن هذه الصيغة.
16 و32 و48 بكسل تغطي هذه المقاسات الثلاثة تبويب المتصفح ومبدّل Alt-Tab وسطح المكتب، وهي المجموعة الموصى بها منذ 1995. ولا تُضِف 256 إلا إذا كان على الأيقونة أن تصمد أيضاً في عرض الأيقونات الكبيرة.
نعم — فهذا سبب وجودها الصيغة حاوية: ترويسة من ستة بايتات، ومدخل دليل بطول ستة عشر بايتاً لكل صورة، ثم الصور. وكل واحدة منها رسم مستقل، ولهذا تبقى الأيقونة الجيدة حادة عند 16 بكسل.
لا، إن جرى الأمر بشكل صحيح كلتا طريقتَي تخزين الصورة داخل ملف .ico تحملان قناة ألفا كاملة بثمانية بتات. ولا تُفقد الشفافية إلا حين تترك أداة بايتات ألفا فارغة أو تُسقط قناع البت الواحد الذي تقرؤه البرمجيات القديمة بدلاً منها.
264 كيلوبايت دون ضغط، أو بضعة كيلوبايتات بصيغة PNG الطبقة غير المضغوطة بمقاس 256 بكسل تساوي 270,376 بايت بالضبط — 40 بايت ترويسة، و262,144 بايت بكسلات، و8,192 بايت قناع — مهما كانت الصورة. أما تخزين الطبقة نفسها بصيغة PNG فيكلّف عادةً بضعة كيلوبايتات.
ملف .ico ليس صيغة صورة بقدر ما هو أرشيف صغير من الصور. يبدأ بترويسة من ستة بايتات تذكر عدد الصور بداخله، يليها مدخل في الدليل بطول ستة عشر بايتاً لكل صورة يعطي عرضها وارتفاعها وعدد بايتاتها وموضعها في الملف، ثم تأتي بيانات الصور نفسها. ويمكن تخزين كل صورة بإحدى طريقتين: ملف PNG كامل مُضمَّن كما هو، أو صورة نقطية غير مضغوطة بنمط Windows مُلحق بها من الأسفل قناع شفافية بعمق بت واحد.
هذا التصميم هو سبب قدرة أيقونة الموقع على أن تبدو حادة عند 16 بكسل في تبويب المتصفح وعند 48 بكسل في مدير الملفات — فهي رسوم مختلفة ضُبطت يدوياً عند كل مقاس، لا صورة واحدة يُعاد تحجيمها. وهو أيضاً سبب المفاجآت القليلة في هذه الصيغة. فطول الضلع يُخزَّن في بايت واحد، لذا يُكتب 256 صفراً ولا يمكن كتابة 512 إطلاقاً. كما يسجّل الدليل لكل مدخل مقاساً تسجّله بيانات الصورة نفسها أيضاً، ما يعني أن الاثنين قد يتعارضان — وبرمجيات مختلفة تصدّق أحدهما دون الآخر.
$ file favicon.ico
favicon.ico: MS Windows icon resource - 3 icons, 16x16, 32 bits/pixel, 32x32, 32 bits/pixel
$ python3 -c "from PIL import Image; print(sorted(Image.open('favicon.ico').ico.sizes()))"
[(16, 16), (32, 32), (48, 48)] 16 و32 و48 بكسل افتراضياً، وحتى 256. ويُرسم كل مقاس من الأصل على حدة بجودة كاملة بدل تحجيمه من الطبقة الأعلى منه، فلا ترث المقاسات الصغيرة ضبابية مقاس أكبر.
لصيغتَي الحمولة المشروعتين مقايضات شديدة الاختلاف، ومعظم المحوّلات لا تذكر إطلاقاً أيهما تكتب. أما هنا فالأمر مفتاح، ويُعرض حجم الملف الناتج لكل منهما فيُتخذ القرار على رقم لا على تخمين.
تُكتب قناة ألفا كاملة، ويُشتق منها قناع البت الواحد الذي تقرؤه البرمجيات القديمة بدلاً منها بدل أن يُترك فارغاً. وترك ذلك القناع فارغاً هو ما يحوّل أيقونة شفافة إلى مربع أسود في الأماكن التي لا تقرأ سوى القناع.
يسرد التبويب العكسي كل صورة داخل ملف .ico بمقاسها الحقيقي وصيغة تخزينها وعمق بتاتها ومصدر شفافيتها — بما في ذلك الصور النقطية القائمة على لوحة ألوان التي ما زالت تستخدمها أيقونات مواقع معروفة. والمتصفح لن يعرض لك سوى واحدة منها.
إذا ادّعى الدليل مقاساً لا تطابقه بيانات الصورة، يُشار إلى ذلك. ويُشار كذلك إلى أي PNG مضمَّن سيرميه Firefox — فمُفكِّك ترميز ICO لديه لا يقبل سوى RGB أو RGBA بثمانية بتات، فتختفي عنده طبقة لوحة الألوان أو التدرّج الرمادي تماماً بينما تعرضها بقية المتصفحات كلها. وكلاهما سبب شائع لأن تعمل الأيقونة في برنامج وتظهر فارغة في آخر، ولا يبلّغ عن أيٍّ منهما محوّل آخر.
تجري القراءة وتغيير الحجم والتجميع كلها في هذه الصفحة. ولا يصل الملف إلى أي خادم، فلا يبقى شيء لحذفه لاحقاً ولا طابور انتظار.
magick in.png -define icon:auto-resize=48,32,16 favicon.ico الجواب المعتاد، وسبب كون كثير من أيقونات المواقع غير مضغوط. تُحوَّل كل طبقة عدا 256 بكسل إلى صورة نقطية قبل التجميع، فتخرج المقاسات الثلاثة في نحو 15 كيلوبايت بدل بضع مئات من البايتات. وتُكتب المقاسات من الأكبر إلى الأصغر.
img.save('favicon.ico', sizes=[(16,16),(32,32),(48,48)]) تُضمّن PNG، فتشغل المقاسات الثلاثة نفسها نحو عُشر المساحة. وتقرأ Pillow صيغة ICO جيداً أيضاً: Image.open(f).ico.sizes() تسرد ما بالداخل، وهو أمر مفيد لفحص ملف شخص آخر.
npx png-to-ico icon.png > favicon.ico أداة سطر أوامر أحادية الغرض تأخذ ملف PNG واحداً أو أكثر وتجمّعها حمولات PNG. وهي مريحة داخل سكربت بناء؛ ولا تغيّر المقاس نيابةً عنك، فتزوّدها بكل مقاس ملفاً مستقلاً.
sharp(input).resize(32).png() ممتازة لإنتاج ملفات PNG المفردة لكنها لا تكتب حاويات ICO، لذا تُقرن عادةً بإحدى أدوات التجميع أعلاه. وهي مصدر ارتباك شائع حين يكون خط البناء مبنياً أصلاً على sharp.
github.com/Kodeworks/golang-image-ico تكتب ملف ICO بصورة واحدة انطلاقاً من قيمة image.Image. وهذا يكفي لأيقونة موقع بمقاس واحد؛ أما تجميع عدة مقاسات في حاوية واحدة فيعني كتابة الدليل بنفسك، وهو نحو ثلاثين سطراً.
.rc وrc.exe هكذا تُنتج أيقونات التطبيقات عادةً. يُضمّن المصرّف ملف .ico في قسم الموارد داخل الملف التنفيذي؛ والحاوية بداخله بالصيغة نفسها تماماً التي عليها أيقونة موقع ويب.
.ico يصدّر كل طبقة من الصورة مقاسَ أيقونة واحداً ويتيح لك اختيار عمق البتات لكل طبقة، بما في ذلك PNG المضغوط. وهو من الأدوات الرسومية القليلة التي تُظهر هذا الخيار بدل أن تحسمه بصمت.
sips -s format ico in.png --out favicon.ico يوجد في macOS بالفعل أداة لكتابة ICO: إذ يُدرج sips --formats الصيغة com.microsoft.ico كقابلة للكتابة، وقد أنتج الأمر أعلاه ملفاً سليماً هنا. ما لا يفعله هو حزم عدة مقاسات؛ فالمُخرَج كان طبقة واحدة بمقاس 48×48. أما iconutil الذي تقترحه نتائج البحث عادةً فيُنتج .icns، حاوية Apple الخاصة، التي لا يقرؤها Windows ولا المتصفحات.
$ xxd -l 38 favicon.ico
00000000: 0000 0100 0300 1010 0000 0100 2000 e903 ............ ... 00000010: 0000 3600 0000 2020 0000 0100 2000 6c05 ..6... .... .l. 00000020: 0000 1f04 0000 ......
0000 هو الحقل المحجوز، و0100 يعني النوع 1 (أيقونة لا مؤشّراً)، و0300 يقول إن الصور ثلاث. ثم يأتي أول مدخل في الدليل بطول 16 بايتاً: 10 10 هو 16×16، و00 عدد الألوان، و00 محجوز، و0100 مستوٍ واحد، و2000 هو 32 بت لكل بكسل، وe903 0000 هو 1,001 بايت من الحمولة عند الإزاحة 3600 0000 = 54 — وهي بالضبط 6 + 3 × 16، أي نهاية الدليل. وكل رقم مكتوب بترتيب little-endian عدا المقاسات، فهي بايت واحد لكل منها.
bWidth = 0x00 bHeight = 0x00
256 × 256
في الدليل بايت واحد لكل ضلع، فأكبر رقم يمكن أن يحمله هو 255، و0 مُعرَّف ليعني 256. وهذا أيضاً سبب عدم عرض مقاس 512 بكسل في أي موضع من هذه الصفحة: لا يوجد بايت يعني 512. ومع ذلك يعرضه عدد من المحوّلات على الإنترنت، فتكتب صورة بمقاس 512 بكسل خلف مدخل دليل لا يستطيع وصفها.
16 + 32 + 48 px, PNG payloads 16 + 32 + 48 px, uncompressed BMP payloads
389 bytes 15,086 bytes
الحمولة غير المضغوطة تكلّف 40 + w × h × 4 بايت زائد قناع بعمق بت واحد، فحجمها يعتمد على الأبعاد وحدها ولا يعتمد إطلاقاً على الصورة. ولهذا تستطيع ثلاثة مواقع مختلفة تماماً أن تشحن ثلاث أيقونات مختلفة تماماً في ملفات متطابقة الطول.
$ magick logo.png -define icon:auto-resize=48,32,16 favicon.ico $ file favicon.ico
favicon.ico: MS Windows icon resource - 3 icons, 48x48, 32 bits/pixel, 32x32, 32 bits/pixel
يحوّل ImageMagick كل طبقة عدا مقاس 256 بكسل إلى صورة نقطية غير مضغوطة قبل تجميعها، ولهذا يكون ناتجه نحو 15 كيلوبايت بدل بضع مئات من البايتات. وتفعل Pillow العكس فتُضمّن PNG: Image.open('logo.png').save('favicon.ico', sizes=[(16,16),(32,32),(48,48)]).
$ magick favicon.ico favicon-%d.png
favicon-0.png 48×48 favicon-1.png 32×32 favicon-2.png 16×16
لا يستطيع المتصفح أن يفعل هذا نيابةً عنك. أعطِ وسم <img> ملف .ico متعدد المقاسات فتحصل على صورة واحدة فقط — أكبرها — مهما كان ترتيب المقاسات بداخله. ومعرفة ما في الملف فعلاً تعني تحليل الحاوية يدوياً، وهو ما يفعله تبويب «ICO ← PNG».
تُقبل صيغ PNG وJPG وSVG وWebP وGIF وBMP حتى 10 ميجابايت. ولا يغادر شيء المتصفح: يُقرأ الملف عبر File API ويُرسم كل بكسل على canvas محلي.
تبدأ المقاسات 16 و32 و48 بكسل محدَّدة. أضف 64 أو 128 أو 256 إذا كان على الأيقونة أن تصمد في عرض الأيقونات الكبيرة أو على سطح مكتب عالي الكثافة. وإذا كان مصدرك أصغر من أكبر مقاس حدّدته، تقول الصفحة ذلك بدل أن تُكبّره بصمت.
PNG هو الافتراضي لأنه أصغر بمرتبة كاملة ولأن كل متصفح حالي وكل إصدار من Windows منذ Vista يقرؤه. بدّل إلى BMP غير المضغوط إذا أردت الشكل الذي توجد عليه فعلاً معظم الأيقونات المنشورة. ويُعرض حجما الملفين جنباً إلى جنب.
احفظ ملف .ico، واستخدم زر نسخ وسوم link للحصول على الترميز. وما زال المسار /favicon.ico في الجذر يعمل احتياطياً، لكن المسار الذي أُمرت المتصفحات بتجربته أولاً هو عنصر link الصريح.
يجب أن يكون بايت الدليل لصورة بمقاس 256 بكسل صفراً. وكتابة 255 تبدو خطأً بمقدار واحد لا ضرر منه، لكنها تنتج ملفاً ترفض بعض المتصفحات رسمه بصمت.
bWidth = 0xFF bHeight = 0xFF ; "255"، والمقصود 256
bWidth = 0x00 bHeight = 0x00 ; 0 مُعرَّف ليعني 256
حين يقول مدخل الدليل 16×16 فوق حمولة هي في الحقيقة 32×32، تنقسم فاكّات الترميز: بعضها يصدّق الدليل فلا يرسم شيئاً، وبعضها يصدّق الحمولة فيعرضها سليمة. فيعمل الملف عندئذٍ على جهاز ويكون غير مرئي على آخر.
مدخل: 16×16 حمولة IHDR: 32×32
مدخل: 32×32 حمولة IHDR: 32×32
داخل الطبقة غير المضغوطة يغطي الارتفاع البيانات اللونية والقناع معاً. وكتابة الارتفاع المجرد تنتج ملفاً يظهر فارغاً في بعض فاكّات الترميز والنصف السفلي من الصورة في غيرها، دون أي خطأ في الحالتين.
biHeight = 32 ; لصورة بمقاس 32 بكسل
biHeight = 64 ; 2 × 32، البيانات اللونية زائد القناع
تملأ بعض الأدوات القناع وتترك كل بايت ألفا صفراً. فيقرأ أحد فاكّات الترميز ذلك صورةً شفافة تماماً فتختفي الأيقونة، ويرجع آخر إلى القناع فيعرضها سليمة. وكتابة الاثنين معاً وبشكل متّسق تُغني عن هذا الجدل كله.
بايتات ألفا: كلها 0x00 القناع: كله 0x00
بايتات ألفا: قيم حقيقية القناع: مضبوط حيث ألفا < 128
تُحجب المراجع الخارجية داخل ملف SVG عند تحويله إلى صورة نقطية، ولا يبلّغ عن ذلك شيء — فلا يُطلق خطأ ويبقى canvas قابلاً للقراءة. ويُخبَز عندئذٍ عنصر الصورة المكسورة النائب داخل الأيقونة. ضمّن الرسم داخل الملف قبل التحويل.
<image href="https://cdn.example.com/logo.png"/>
<image href="data:image/png;base64,iVBORw0KGgo…"/>
00 00 محجوزة، و01 00 للأيقونة (و02 00 يُعلِّم ملف مؤشّر)، ثم عدّاد من بايتين. وكل مدخل في الدليل هو العرض والارتفاع وحجم لوحة الألوان وبايت محجوز — بايت واحد لكل منها — يليها حقلا المستويات وعمق البتات بطول بايتين، وحقلان بطول أربعة بايتات يعطيان طول الحمولة وإزاحتها. وكل ما هو متعدد البايتات مكتوب بترتيب little-endian.ceil(w ÷ 32) × 4 بايت لكل صف. فطبقة 16 بكسل تساوي إذن 1,128 بايت، و48 بكسل 9,640، و256 بكسل 270,376 — بصرف النظر عما تعرضه الصورة. وهذه الكلفة الثابتة هي سبب قدرة ثلاثة مواقع لا رابط بينها على شحن أيقونات متطابقة الطول بايتاً ببايت، وسبب عدم عرض طبقة 256 بكسل هنا إلا حين تكون الحمولة PNG.image/vnd.microsoft.icon لدى IANA في سبتمبر 2003، والمرجع الذي يستشهد به مقالة من Microsoft عام 1995 عنوانها «Icons in Win32». أما RFC 2361، الذي يُقتبس على نطاق واسع بوصفه مواصفة ICO، فعنوانه في الحقيقة «WAVE and AVI Codec Registries» ولا يذكر الصور إطلاقاً.magick logo.png -define icon:auto-resize=48,32,16 favicon.ico. أدوات التحويل
حوّل بين الأنظمة الثنائية والست عشرية والعشرية والثمانية وأي أساس من 2 إلى 36 فوراً — أداة مجانية أونلاين تعمل في متصفّحك. جرّبها الآن.
أدوات التحويل
اكتب عدداً صحيحاً ذا إشارة لتحصل دفعة واحدة على الإشارة والمقدار والمتمم الأحادي والمتمم الثنائي والثنائي المزاح، بعرض 4 إلى 64 بت. أو الصق نمط بتات أو بايتاً ست عشرياً لترى قراءاته الخمس جنباً إلى جنب. محلي ومجاني وبلا تسجيل.
أدوات التحويل
حوّل صلاحيات ملفات لينكس بين النظام الثماني (755، 644) ورموز rwx. احصل على أوامر chmod جاهزة للتشغيل، واكشف الإعدادات الخطرة مثل 777 — مجاناً وداخل متصفحك مباشرة.
أدوات التحويل
حوّل ألوان HEX إلى RGB و HSL و OKLCH و OKLAB و CMYK داخل متصفحك — انسخ أي صيغة بنقرة واحدة. مجاني، بلا تسجيل، ألوانك لا تغادر الصفحة أبداً.
أدوات التحويل
حوّل ألوان HEX إلى CMYK في المتصفح. تقريب ساذج قائم على sRGB لمعاينات الطباعة. مجاني، بلا تسجيل، ألوانك تبقى محلياً.
أدوات التحويل
حوّل أي لون HEX إلى HSL في المتصفح — يدعم 3 و6 و8 أرقام مع alpha. مجاني، فوري، بلا تسجيل، ألوانك لا تغادر الصفحة أبداً.