गहन विश्लेषण

ICO प्रारूप विश्लेषण: संरचना, हेडर और क्यों यह अब भी मौजूद है

koboshiCo-founder
·17 मिनट पढ़ें
ICO प्रारूप विश्लेषण: संरचना, हेडर और क्यों यह अब भी मौजूद है
सारांश

ICO एक कंटेनर है, इमेज कोडेक नहीं। 1985 में Windows 1.0 के लिए बनाया गया, यह एक ही फाइल में एक आइकन के कई रेज़ॉल्यूशन स्टोर करता है ताकि OS रनटाइम पर सही साइज़ चुन सके। यहाँ पूरी तकनीकी व्याख्या है — छह-बाइट हेडर से लेकर यह तक कि SVG फेविकॉन ने अब तक इसे क्यों नहीं मारा।

ICO फाइल को एक हेक्स एडिटर में खोलें। पहले छह बाइट्स:

00 00 01 00 03 00

यह पूरी फाइल हेडर है। 00 00 Reserved फील्ड है — हमेशा ज़ीरो। 01 00 Type फील्ड है — 1 का मतलब है कि यह एक आइकन फाइल है (कर्सर फाइल्स 2 का इस्तेमाल करती हैं)। 03 00 Count फील्ड है — little-endian में 3, यानी इस ICO में तीन अलग इमेज हैं। तीन इंडिपेंडेंट इमेज फाइल्स रखने वाले कंटेनर का वर्णन छह बाइट्स में। फाइल का बाकी हिस्सा उन इमेज के मेटाडेटा का है, जिसके बाद इमेज डेटा खुद आता है।

ICO न तो कोई कंप्रेशन अलगोरिदम है और न ही कोई कलर स्पेस — यह सिर्फ़ एक कंटेनर है, और वो भी अब तक का सबसे छोटा और सबसे बुनियादी कंटेनर प्रारूप जो आज भी हर Windows मशीन और हर प्रमुख ब्राउज़र में रोज़मर्रा के काम आता है।

ICO की उत्पत्ति कहाँ हुई

Microsoft ने ICO 1985 में Windows 1.0 के साथ पेश किया। 1985 में PC इकोसिस्टम में स्टैंडर्डाइज़्ड इमेज फाइल की कोई धारणा नहीं थी। न JPEG था, न PNG, न GIF। बिटमैप डेटा पिक्सेल के रॉ एरे थे, और हर प्रोग्राम अपना स्टोरेज खुद संभालता था। Microsoft को प्रोग्राम, फोल्डर और सिस्टम UI एलिमेंट्स के लिए आइकन देने का एक तरीका चाहिए था। ज़रूरतें सरल थीं:

  • एक आइकन के लिए एक फाइल, चाहे OS को कितने भी साइज़ की ज़रूरत हो
  • रनटाइम पर तेज़ लुकअप — OS को डाइमेंशन जानने के लिए इमेज डीकोड न करनी पड़े
  • 256 KB RAM वाले सिस्टम पर छोटा मेमोरी फुटप्रिंट

समाधान एक डायरेक्टरी स्ट्रक्चर था। फाइल एक हेडर से शुरू होती है जो बताता है कि अंदर कितनी इमेज हैं। फिर एंट्रीज़ का एक एरे आता है, जिसमें हर एक इमेज की चौड़ाई, ऊँचाई, बिट डेप्थ और फाइल के अंदर ऑफसेट का वर्णन होता है। OS डायरेक्टरी पढ़ता है, मौजूदा डिस्प्ले कॉन्टेक्स्ट से मेल खाने वाली एंट्री चुनता है, उस ऑफसेट पर जाता है, और बिटमैप रेंडर करता है।

यह डिज़ाइन ZIP से दो साल पहले का है, GIF से दो साल पहले का है, और JPEG से सात साल पहले का है। ICO एक मिनिएचर फाइलसिस्टम था, इससे पहले कि फाइलसिस्टम दिलचस्प बनें।

ICO क्यों मौजूद है

एक आइकन सिर्फ़ एक इमेज नहीं होता, बल्कि एक ही आइकन के कई अलग-अलग आकारों का संग्रह होता है। Windows एक ही आइकन को फाइल लिस्ट में 16 x 16, डेस्कटॉप पर 32 x 32, Explorer डिटेल पेन में 48 x 48, और "एक्सट्रा लार्ज" व्यू में 256 x 256 पर रेंडर करता है। 200% स्केल वाला हाई-DPI डिस्प्ले एक 32 x 32 आइकन को 64 x 64 सोर्स से रेंडर करना चाहता है। OS कॉन्टेक्स्ट के आधार पर तय करता है कि कौन सा साइज़ इस्तेमाल करना है, और यह चुनाव पलक झपकते में होना चाहिए।

अगर आइकन अलग-अलग PNG फाइल्स में स्टोर किए जाते, तो OS को कई फाइलें खोलनी पड़तीं, हर एक को डीकोड करना पड़ता, और नतीजों को कैश करना पड़ता। ICO के साथ, OS एक फाइल खोलता है, 16-बाइट डायरेक्टरी एंट्री पढ़ता है, और सीधे बिटमैप डेटा पर कूद जाता है। डायरेक्टरी इस प्रारूप को सेल्फ-डिस्क्राइबिंग बनाती है। मेटाडेटा के लिए कोई डिकोडर नहीं चाहिए।

वेबसाइट आइकन यानी फेविकॉन के मामले में भी यही बात लागू होती है। जब एक ब्राउज़र /favicon.ico रिक्वेस्ट करता है, तो उसे एक फाइल मिलती है जिसमें हर साइज़ होता है जिसकी उसे ज़रूरत हो सकती है — टैब के लिए 16 x 16, बुकमार्क बार के लिए 32 x 32, iOS होम स्क्रीन शॉर्टकट्स के लिए 180 x 180। ब्राउज़र इमेज हेडर पार्स किए बिना सही एंट्री चुन लेता है।

फाइल हेडर

ICO हेडर के दो हिस्से हैं: ICONDIR और ICONDIRENTRY एरे।

ICONDIR (6 बाइट्स)

Bytes 0-1: Reserved     (must be 0)
Bytes 2-3: Type         (1 = icon, 2 = cursor)
Bytes 4-5: Count        (number of images, little-endian uint16)

हर ICO फाइल 00 00 01 00 से शुरू होती है। अगले दो बाइट्स बताते हैं कि कितनी इमेज आगे हैं।

ICONDIRENTRY (हर एक 16 बाइट्स)

हर इमेज को एक एंट्री मिलती है:

Bytes 0:    Width         (in pixels; 0 means 256)
Bytes 1:    Height        (in pixels; 0 means 256)
Bytes 2:    ColorCount    (0 if more than 256 colors)
Bytes 3:    Reserved      (always 0)
Bytes 4-5:  Planes        (1 for icons)
Bytes 6-7:  BitCount      (bits per pixel: 1, 4, 8, 24, or 32)
Bytes 8-11: BytesInRes    (size of image data in bytes, uint32)
Bytes 12-15: ImageOffset  (byte offset to image data from file start, uint32)

Width और Height फील्ड एक-एक बाइट की हैं। स्पष्ट रूप से स्टोर करने योग्य अधिकतम वैल्यू 255 है। जब एक इमेज 256 x 256 पिक्सेल होती है, तो फील्ड 0x00 स्टोर करती है, जिसे डिकोडर 256 के रूप में समझते हैं। यह विलक्षणता 1985 से स्पेसिफिकेशन का हिस्सा रही है।

यहाँ देखें कि तीन इमेज वाले ICO के लिए डायरेक्टरी कैसी दिखती है — एक 16 x 16 BMP, एक 32 x 32 BMP, और एक 256 x 256 PNG:

Offset 0x00:  00 00 01 00 03 00                    -- ICONDIR: 3 images
Offset 0x06:  10 10 00 00 01 00 18 00 2C 01 00 00 16 00 00 00  -- 16x16, 24bpp, BMP, 300 bytes at 0x16
Offset 0x16:  20 20 00 00 01 00 18 00 A8 02 00 00 42 01 00 00  -- 32x32, 24bpp, BMP, 680 bytes at 0x142
Offset 0x26:  00 00 00 00 01 00 20 00 B4 1C 00 00 EA 03 00 00  -- 256x256, 32bpp, PNG, 7348 bytes at 0x3EA

OS डायरेक्टरी पढ़ता है, अपनी ज़रूरत से मेल खाने वाली एंट्री ढूंढता है, और ImageOffset पर सीधे पहुँच जाता है — न कोई विश्लेषण, न कोई अनुमान, सिर्फ़ सीधी मेमोरी पहुँच।

PNG, WebP, और JPEG ने ICO को क्यों नहीं बदला

हर आधुनिक मापदंड से, PNG ICO के आंतरिक बिटमैप एन्कोडिंग से बेहतर प्रारूप है। PNG में बेहतर कंप्रेशन है, असली अल्फा ट्रांसपेरेंसी है, और व्यापक टूलिंग है। WebP और भी छोटा है। JPEG फोटोग्राफ्स संभालता है। फिर भी ICO कायम है। तीन कारण:

1. सिंगल-फाइल मल्टी-रेज़ॉल्यूशन। PNG एक इमेज स्टोर करता है। ICO मनमानी संख्या में स्टोर करता है। एक वेबसाइट PNG का ZIP सर्व कर सकती है, लेकिन कोई ब्राउज़र नहीं जानता कि फेविकॉन के लिए सही एक कौन सा चुनना है। ICO डायरेक्टरी स्ट्रक्चर इसे छह बाइट्स में हल कर देता है।

2. सिस्टम API बाइंडिंग। Windows LoadIcon, ExtractIcon, और SHGetFileInfo सभी ICO डेटा की उम्मीद करते हैं। Win32 API में PNG आइकन कंटेनर के लिए कोई समकक्ष नहीं है। इसे बदलने से 1985 से कंपाइल की गई हर Windows एप्लिकेशन टूट जाएगी। Microsoft पुराने सॉफ्टवेयर के साथ संगतता तोड़ने का जोखिम नहीं उठाती।

3. फेविकॉन स्टैंडर्ड। HTML <link rel="icon"> टैग PNG, SVG, और ICO स्वीकार करता है, लेकिन /favicon.ico के लिए अंतर्निहित डिफ़ॉल्ट रिक्वेस्ट इन विकल्पों से पहले की है। Internet Explorer 5 (1999) से हर ब्राउज़र डिफ़ॉल्ट रूप से /favicon.ico रिक्वेस्ट करता है। साइट्स जो स्पष्ट रूप से फेविकॉन लिंक घोषित नहीं करतीं, उन्हें उस पाथ पर एक ICO की ज़रूरत होती है, नहीं तो ब्राउज़र को 404 मिलता है।

PNG ने ICO को नहीं बदला क्योंकि ICO कभी इमेज क्वालिटी पर प्रतिस्पर्धा नहीं कर रहा था। यह कंटेनर सेमेंटिक्स पर प्रतिस्पर्धा कर रहा था, और कोई दूसरा प्रारूप तीस साल से ज़्यादा ऑपरेटिंग सिस्टम सपोर्ट के साथ वही फाइल-के-अंदर-डायरेक्टरी मॉडल नहीं देता।

कंटेनर के अंदर क्या है

ICO फाइल में हर एंट्री एक इंडिपेंडेंट इमेज की ओर इशारा करती है। इमेज डेटा दो प्रारूपों में से एक हो सकता है:

BMP एन्कोडिंग (लेगेसी)

Windows Vista से पहले, सभी ICO इमेज अनकंप्रेस्ड या RLE-कंप्रेस्ड BMP बिटमैप थीं। स्टोर किया गया डेटा एक DIB (Device Independent Bitmap) है — BITMAPFILEHEADER के बिना एक BMP। यह सीधे BITMAPINFOHEADER से शुरू होता है:

Bytes 0-3:   Header size      (40 for BITMAPINFOHEADER)
Bytes 4-7:   Width            (uint32)
Bytes 8-11:  Height           (uint32, doubled for XOR + AND masks)
Bytes 12-13: Planes           (1)
Bytes 14-15: BitCount         (1, 4, 8, 24, or 32)
Bytes 16-19: Compression      (0 for uncompressed, 1 or 2 for RLE)
Bytes 20-23: Image size       (0 if uncompressed)
Bytes 24-27: X pixels per meter
Bytes 28-31: Y pixels per meter
Bytes 32-35: Colors used
Bytes 36-39: Important colors

DIB हेडर में Height फील्ड असली आइकन ऊँचाई की दोगुनी होती है। एक 32 x 32 आइकन Height फील्ड में 64 स्टोर करता है। ऊपरी आधा हिस्सा XOR मास्क (असली कलर इमेज) है, और निचला आधा हिस्सा AND मास्क (1-बिट ट्रांसपेरेंसी बिटमैप) है। अल्फा चैनल वाले 32-बिट आइकन के लिए, AND मास्क आम तौर पर नज़रअंदाज़ किया जाता है।

24-बिट और उससे कम BMP-एन्कोडेड आइकन के लिए जिनमें अल्फा नहीं है, AND मास्क एकमात्र ट्रांसपेरेंसी मैकेनिज़्म है। AND मास्क में 1 का मतलब ट्रांसपेरेंट है; 0 का मतलब ओपेक है। इस तरह Windows ने 32-बिट कलर के स्टैंडर्ड बनने से पहले ट्रांसपेरेंसी हासिल की।

PNG एन्कोडिंग (Windows Vista+)

Windows Vista से शुरू होकर, ICO फाइलें PNG-एन्कोडेड इमेज स्टोर कर सकती हैं। ICONDIRENTRY में बताए गए ऑफसेट पर इमेज डेटा एक रॉ PNG फाइल है — अपने 89 50 4E 47 सिग्नेचर और पूरी PNG चंक स्ट्रक्चर के साथ।

यह वह प्रारूप है जो आप 256 x 256 आइकन के लिए चाहते हैं। एक 256 x 256 32-बिट BMP अनकंप्रेस्ड लगभग 262 KB होगी। वही इमेज PNG में आम तौर पर 20-60 KB होती है। आधुनिक आइकन टूल्स 256 x 256 के लिए PNG-एन्कोडेड एंट्री और छोटे साइज़ के लिए BMP-एन्कोडेड एंट्री जनरेट करते हैं, जो कंपैटिबिलिटी और फाइल साइज़ का सबसे अच्छा संतुलन देता है।

एन्कोडिंग तुलना

एन्कोडिंगपेश किया गयाकंप्रेशनअल्फा सपोर्टसबसे अच्छा किसके लिए
BMPWindows 1.0 (1985)None or RLE1-bit AND mask16 x 16 to 48 x 48
PNGWindows Vista (2006)DEFLATE8-bit alpha64 x 64 to 256 x 256

ICO फाइल्स का पता लगाना और निरीक्षण करना

.ico एक्सटेंशन पर भरोसा न करें। पहले छह बाइट्स पढ़ें और डायरेक्टरी का विश्लेषण करें।

TypeScript

interface IcoEntry {
  width: number
  height: number
  bitCount: number
  bytesInRes: number
  imageOffset: number
}

interface IcoInfo {
  valid: boolean
  type: "icon" | "cursor" | "unknown"
  count: number
  entries: IcoEntry[]
}

async function inspectIco(file: File): Promise<IcoInfo> {
  const buffer = await file.slice(0, 1024).arrayBuffer()
  const bytes = new Uint8Array(buffer)

  if (bytes.length < 6)
    return { valid: false, type: "unknown", count: 0, entries: [] }

  const reserved = bytes[0] | (bytes[1] << 8)
  const type = bytes[2] | (bytes[3] << 8)
  const count = bytes[4] | (bytes[5] << 8)

  if (reserved !== 0 || (type !== 1 && type !== 2)) {
    return { valid: false, type: "unknown", count: 0, entries: [] }
  }

  const entries: IcoEntry[] = []
  const dirSize = 6 + count * 16
  if (bytes.length < dirSize) {
    return { valid: false, type: "unknown", count: 0, entries: [] }
  }

  for (let i = 0; i < count; i++) {
    const off = 6 + i * 16
    entries.push({
      width: bytes[off] === 0 ? 256 : bytes[off],
      height: bytes[off + 1] === 0 ? 256 : bytes[off + 1],
      bitCount: bytes[off + 6] | (bytes[off + 7] << 8),
      bytesInRes:
        bytes[off + 8] |
        (bytes[off + 9] << 8) |
        (bytes[off + 10] << 16) |
        (bytes[off + 11] << 24),
      imageOffset:
        bytes[off + 12] |
        (bytes[off + 13] << 8) |
        (bytes[off + 14] << 16) |
        (bytes[off + 15] << 24),
    })
  }

  return {
    valid: true,
    type: type === 1 ? "icon" : "cursor",
    count,
    entries,
  }
}

Python

import struct
from typing import TypedDict

class IcoEntry(TypedDict):
    width: int
    height: int
    bit_count: int
    bytes_in_res: int
    image_offset: int

class IcoInfo(TypedDict):
    valid: bool
    type: str
    count: int
    entries: list[IcoEntry]

def inspect_ico(path: str) -> IcoInfo:
    with open(path, "rb") as f:
        header = f.read(1024)

    if len(header) < 6:
        return {"valid": False, "type": "unknown", "count": 0, "entries": []}

    reserved, type_, count = struct.unpack("<HHH", header[:6])
    if reserved != 0 or type_ not in (1, 2):
        return {"valid": False, "type": "unknown", "count": 0, "entries": []}

    dir_size = 6 + count * 16
    if len(header) < dir_size:
        return {"valid": False, "type": "unknown", "count": 0, "entries": []}

    entries: list[IcoEntry] = []
    for i in range(count):
        off = 6 + i * 16
        w, h, colors, _, planes, bit_count = struct.unpack("<BBBBHH", header[off:off+8])
        bytes_in_res, image_offset = struct.unpack("<II", header[off+8:off+16])
        entries.append({
            "width": 256 if w == 0 else w,
            "height": 256 if h == 0 else h,
            "bit_count": bit_count,
            "bytes_in_res": bytes_in_res,
            "image_offset": image_offset,
        })

    return {
        "valid": True,
        "type": "icon" if type_ == 1 else "cursor",
        "count": count,
        "entries": entries,
    }

Go

package main

import (
	"encoding/binary"
	"fmt"
	"os"
)

type IcoEntry struct {
	Width        int
	Height       int
	BitCount     int
	BytesInRes   uint32
	ImageOffset  uint32
}

type IcoInfo struct {
	Valid   bool
	Type    string
	Count   int
	Entries []IcoEntry
}

func inspectIco(path string) (IcoInfo, error) {
	f, err := os.Open(path)
	if err != nil {
		return IcoInfo{}, err
	}
	defer f.Close()

	buf := make([]byte, 1024)
	n, _ := f.Read(buf)
	buf = buf[:n]

	if n < 6 {
		return IcoInfo{Valid: false, Type: "unknown"}, nil
	}

	reserved := binary.LittleEndian.Uint16(buf[0:2])
	typ := binary.LittleEndian.Uint16(buf[2:4])
	count := binary.LittleEndian.Uint16(buf[4:6])

	if reserved != 0 || (typ != 1 && typ != 2) {
		return IcoInfo{Valid: false, Type: "unknown"}, nil
	}

	dirSize := 6 + int(count)*16
	if n < dirSize {
		return IcoInfo{Valid: false, Type: "unknown"}, nil
	}

	entries := make([]IcoEntry, 0, count)
	for i := 0; i < int(count); i++ {
		off := 6 + i*16
		w := buf[off]
		h := buf[off+1]
		bitCount := binary.LittleEndian.Uint16(buf[off+6 : off+8])
		bytesInRes := binary.LittleEndian.Uint32(buf[off+8 : off+12])
		imageOffset := binary.LittleEndian.Uint32(buf[off+12 : off+16])

		if w == 0 { w = 256 }
		if h == 0 { h = 256 }

		entries = append(entries, IcoEntry{
			Width:       int(w),
			Height:      int(h),
			BitCount:    int(bitCount),
			BytesInRes:  bytesInRes,
			ImageOffset: imageOffset,
		})
	}

	typStr := "icon"
	if typ == 2 {
		typStr = "cursor"
	}
	return IcoInfo{Valid: true, Type: typStr, Count: int(count), Entries: entries}, nil
}

PHP

function inspectIco(string $path): array {
    $header = file_get_contents($path, false, null, 0, 1024);
    if (strlen($header) < 6) {
        return ["valid" => false, "type" => "unknown", "count" => 0, "entries" => []];
    }

    $reserved = unpack("v", substr($header, 0, 2))[1];
    $type = unpack("v", substr($header, 2, 2))[1];
    $count = unpack("v", substr($header, 4, 2))[1];

    if ($reserved !== 0 || ($type !== 1 && $type !== 2)) {
        return ["valid" => false, "type" => "unknown", "count" => 0, "entries" => []];
    }

    $dirSize = 6 + $count * 16;
    if (strlen($header) < $dirSize) {
        return ["valid" => false, "type" => "unknown", "count" => 0, "entries" => []];
    }

    $entries = [];
    for ($i = 0; $i < $count; $i++) {
        $off = 6 + $i * 16;
        $w = ord($header[$off]);
        $h = ord($header[$off + 1]);
        $bitCount = unpack("v", substr($header, $off + 6, 2))[1];
        $bytesInRes = unpack("V", substr($header, $off + 8, 4))[1];
        $imageOffset = unpack("V", substr($header, $off + 12, 4))[1];

        $entries[] = [
            "width" => $w === 0 ? 256 : $w,
            "height" => $h === 0 ? 256 : $h,
            "bit_count" => $bitCount,
            "bytes_in_res" => $bytesInRes,
            "image_offset" => $imageOffset,
        ];
    }

    return [
        "valid" => true,
        "type" => $type === 1 ? "icon" : "cursor",
        "count" => $count,
        "entries" => $entries,
    ];
}

ImageMagick CLI

magick identify -verbose favicon.ico | grep -E "(Print size|Resolution|Colorspace|Type)"

फाइल के अंदर मौजूद सभी इमेज देखें:

magick identify favicon.ico

एक खास साइज़ निकालें:

magick favicon.ico[2] extracted-256x256.png

या सीधे तौर पर:

file favicon.ico
# favicon.ico: MS Windows icon resource - 5 icons, 16x16, 32 bits/pixel, 32x32, 32 bits/pixel

बेस्ट प्रैक्टिस और उपयोग के मामले

ICO एक जनरल-पर्पज इमेज प्रारूप नहीं है। यह खास कॉन्टेक्स्ट के लिए एक डिप्लॉयमेंट आर्टिफैक्ट है। जहाँ कॉन्टेक्स्ट की ज़रूरत हो वहाँ इसका इस्तेमाल करें, और बाकी हर जगह PNG का इस्तेमाल करें।

फेविकॉन

आधुनिक वेबसाइट्स के लिए, दोनों प्रारूप सर्व करें:

<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />

ब्राउज़र पहला प्रारूप चुनते हैं जिसे वे सपोर्ट करते हैं। SVG-जागरूक ब्राउज़र वेक्टर आइकन पाते हैं। पुराने ब्राउज़र और बुकमार्क यूटिलिटी ICO पर फॉल बैक करते हैं। ICO फाइल में यह होना चाहिए:

साइज़एन्कोडिंगउद्देश्य
16 x 16BMPब्राउज़र टैब, पुराना IE
32 x 32BMPटास्कबार, बुकमार्क बार
48 x 48BMPWindows शॉर्टकट
180 x 180PNGiOS होम स्क्रीन आइकन
256 x 256PNGWindows Explorer एक्सट्रा-लार्ज व्यू

इन पाँच एंट्रीज़ वाला एक फेविकॉन ICO आम तौर पर 30-50 KB होता है। 256 x 256 PNG के बिना, यह 10 KB से कम हो जाता है।

Windows एप्लिकेशन आइकन

Windows एप्लिकेशन एक्जीक्यूटेबल्स एक ICO रिसोर्स एम्बेड करते हैं। OS रनटाइम पर एम्बेडेड डायरेक्टरी से उचित साइज़ लोड करता है। Windows 10 और 11 को टारगेट करने वाली डेस्कटॉप एप्लिकेशन के लिए, शामिल करें:

  • 16 x 16, 24 x 24, 32 x 32, 48 x 48 (BMP, पुराने सिस्टम और स्टैंडर्ड DPI के लिए)
  • 64 x 64, 128 x 128, 256 x 256 (PNG, हाई-DPI डिस्प्ले के लिए)

Windows अपने आप स्केल डाउन करता है अगर एक्जैक्ट साइज़ गायब है, लेकिन स्केलिंग एक नेटिव छोटे साइज़ को रेंडर करने से बदतर दिखती है। आप हर साइज़ जो छोड़ते हैं, उसकी विजुअल क्वालिटी की कीमत चुकानी पड़ती है।

ICO का इस्तेमाल कब न करें

  • वेब कंटेंट इमेज: WebP, JPEG, या PNG का इस्तेमाल करें। ICO का कोई कंप्रेशन फायदा नहीं है और इनलाइन इमेज के लिए कोई ब्राउज़र-नेटिव रेंडरिंग फायदा नहीं है।
  • फोटोग्राफ्स: ICO हाई-कलर कंटीन्यूअस-टोन इमेजरी के लिए डिज़ाइन नहीं किया गया है। फाइल साइज़ फट जाते हैं।
  • क्रॉस-प्लेटफॉर्म एसेट्स: macOS .icns का इस्तेमाल करता है, ICO नहीं। Linux PNG या SVG का इस्तेमाल करता है। ICO एक Windows-नेटिव प्रारूप है जो संयोग से वेब पर काम करता है।

ICO का भविष्य

ICO उन ज़्यादातर अनुमानों से कहीं लंबा जिएगा जो इसके खत्म होने की भविष्यवाणी करते हैं। कारण उसकी शुरुआत वाला ही है: पुराने सॉफ्टवेयर के साथ संगतता।

SVG फेविकॉन तकनीकी रूप से बेहतर हैं। वे किसी भी रेज़ॉल्यूशन तक स्केल होते हैं, किसी भी रास्टर प्रारूप से बेहतर कंप्रेस होते हैं, और एनिमेशन और इंटरएक्टिविटी सपोर्ट करते हैं। Chrome, Firefox, और Safari सभी SVG फेविकॉन सपोर्ट करते हैं। फिर भी ICO कायम है क्योंकि लाखों डिवाइस, बड़े उद्यमों की प्रणालियाँ, और पुराने ब्राउज़र अब भी डिफ़ॉल्ट रूप से /favicon.ico रिक्वेस्ट करते हैं। ICO फाइल के बिना एक साइट सर्वर लॉग में 404 जनरेट करती है और पुराने सॉफ्टवेयर में टूटा हुआ आइकन दिखाती है।

Windows 11 अब भी एप्लिकेशन आइकन, फोल्डर आइकन और सिस्टम UI के लिए ICO का इस्तेमाल करता है। Win32 API अब भी ICO डेटा की उम्मीद करती है। Microsoft ने इस प्रारूप को बदलने में कोई दिलचस्पी नहीं दिखाई है — तीस साल से ज़्यादा एप्लिकेशन संगतता तोड़ने का कोई बिज़नेस कारण नहीं है।

असल में बदलाव सिर्फ़ ICO फाइलें बनाने के तरीके में आ रहा है। आधुनिक टूलचेन — IconKitchen, Figma प्लगइन्स, ऑनलाइन जनरेटर — PNG-एन्कोडेड हाई-रेज़ॉल्यूशन एंट्री के साथ अपने आप ICO फाइल आउटपुट करते हैं। कंटेनर वही रहता है; पेलोड बेहतर हो जाता है।

ICO कोई प्रिय प्रारूप नहीं है, लेकिन यह एक ऐसा प्रारूप है जो हर जगह काम करता है, कुछ नहीं तोड़ता, और इसे सपोर्ट करने में कोई खर्च नहीं आता। यही कारण है कि यह 2035 में भी मौजूद रहेगा।

अगर आपको मौजूदा इमेज से ICO फाइलें बनानी हैं, तो JPG to ICO आपके ब्राउज़र में सीधे JPG, PNG, और WebP सोर्स को मल्टी-रेज़ॉल्यूशन ICO फाइलों में बदलता है — कोई अपलोड नहीं, कोई सर्वर प्रोसेसिंग नहीं। यह स्टैंडर्ड साइज़ मैट्रिक्स जनरेट करता है और 256 x 256 के लिए अपने आप PNG एन्कोडिंग और छोटे साइज़ के लिए BMP एन्कोडिंग चुनता है, जो कंपैटिबिलिटी और फाइल साइज़ का इष्टतम संतुलन देता है।

और ब्लॉग पोस्ट्स पढ़ें