गहन विश्लेषण

HEIC क्या है? फ़ाइल हस्ताक्षर, पहचान और रूपांतरण में एक तकनीकी गहन विश्लेषण

koboshiCo-founder
·6 मिनट पढ़ें
HEIC क्या है? फ़ाइल हस्ताक्षर, पहचान और रूपांतरण में एक तकनीकी गहन विश्लेषण
सारांश

HEIC केवल एक छोटा JPEG नहीं है। यह ISO Base Media File Format पर आधारित एक कंटेनर प्रारूप है जिसके अंदर HEVC-एन्कोडेड छवियाँ हैं। यहाँ बताया गया है कि यह कैसे काम करता है, कच्चे बाइट्स पढ़कर इसे कैसे पहचानें, और जब संगतता विफल हो तो इसे कैसे रूपांतरित करें।

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

00 00 00 18 66 74 79 70 68 65 69 63

यह ISOBMFF है — वही कंटेनर मानक जो MP4 उपयोग करता है। 0x18 (24 बाइट्स) बॉक्स का आकार है, ftyp फ़ाइल प्रकार बॉक्स है, heic मेजर ब्रांड है। HEIC फ़ाइल कोई छवि एन्कोडिंग नहीं है। यह एक ब्रांड मार्कर वाला कंटेनर है, जिसके अंदर HEVC-एन्कोडेड छवियाँ हैं।

HEIC वास्तव में क्या है

HEIC = High Efficiency Image Container。 Apple की HEIF की ब्रांडेड कार्यान्वयन, MPEG द्वारा 2015 में ISO/IEC 23008-12 के रूप में मानकीकृत। JPEG एक संपीडन एल्गोरिदम और एक फ़ाइल प्रारूप दोनों है। HEIC केवल एक कंटेनर है। अंदरूनी संपीडन HEVC (H.265) है, वही कोडेक जो 4K वीडियो के लिए उपयोग किया जाता है।

एक HEIC फ़ाइल में संग्रहीत हो सकता है:

  • एक प्राथमिक छवि
  • कई वैकल्पिक छवियाँ (बर्स्ट शॉट्स)
  • छवि अनुक्रम (Live Photos: स्थिर + 3-सेकंड का वीडियो)
  • अल्फा चैनल और डेप्थ मैप्स
  • प्रति चैनल 16-बिट रंग गहराई (JPEG 8-बिट तक सीमित है)

कंटेनर बॉक्स संरचना का उपयोग करता है — MP4 की तरह ही:

Boxउद्देश्य
ftypफ़ाइल प्रकार और संगत ब्रांड
metaआइटम मेटाडेटा और गुण
mdatकच्ची एन्कोडेड छवि डेटा (HEVC बिटस्ट्रीम)
ilocmdat के भीतर आइटम स्थान

यही विस्तारशीलता HEIC को वे काम करने की अनुमति देती है जो JPEG कभी नहीं कर सकता था। इसे पार्स करने के लिए बॉक्स पदानुक्रम को समझने की आवश्यकता होती है, न कि केवल कच्ची बिटस्ट्रीम पढ़ने की।

Apple ने क्यों बदलाव किया

Apple ने HEIC का आविष्कार नहीं किया। MPEG ने 2015 में HEIF प्रकाशित किया। Apple ने इसे iOS 11 (2017) में iPhone के लिए डिफ़ॉल्ट कैमरा प्रारूप के रूप में अपनाया।

बदलाव गणितीय था, मार्केटिंग नहीं। iPhone की एक विशिष्ट 12MP फोटो JPEG में ~3.5 MB है। HEIC में, ~1.8 MB। 50 GB मुफ्त iCloud स्टोरेज टियर पर, यह अंतर लगभग 14,000 अतिरिक्त तस्वीरों का मतलब है। Apple स्टोरेज टियर बेचती है। हिसाब खुद ब खुद हो जाता है।

पारिस्थितिकी तंत्र का संरेखण भी था। Apple पहले ही वीडियो के लिए HEVC अपना चुकी थी (iOS 11 में H.265)। स्थिर छवियों के लिए उसी कोडेक का पुनः उपयोग करने का अर्थ था A-सीरीज़ चिप्स पर साझा हार्डवेयर डिकोड ब्लॉक, कम बिजली खपत और एकल लाइसेंसिंग पथ।

फायदे और नुकसान

HEIC लगभग हर मेट्रिक पर JPEG से बेहतर है, संगतता को छोड़कर।

पहलूHEICJPEG
संपीडन दक्षतासमान गुणवत्ता पर ~40–50% छोटाबेसलाइन
रंग गहराई16-बिट तक8-बिट
पारदर्शिताहाँनहीं
प्रति फ़ाइल कई छवियाँहाँनहीं
नॉन-डिस्ट्रक्टिव संपादनहाँनहीं
Windows मूल समर्थनHEIF एक्सटेंशन आवश्यकसार्वभौमिक
वेब ब्राउज़र समर्थनकेवल Safariसार्वभौमिक
Android समर्थन9+ पर मूलसार्वभौमिक
पेटेंट लाइसेंसिंगHEVC पेटेंट पूलJPEG रॉयल्टी-मुक्त है

HEVC कई पेटेंट पूल (MPEG LA, Access Advance) द्वारा कवर किया गया है। Apple iOS उपयोगकर्ताओं की ओर से शुल्क का भुगतान करती है। तीसरे पक्ष को यह लाभ नहीं मिलता। यह अनिश्चितता Apple पारिस्थितिकी तंत्र के बाहर अपनाने में रुकावट का एक बड़ा कारण है।

फ़ाइल हस्ताक्षर पढ़कर HEIC की पहचान

.heic एक्सटेंशन पर भरोसा न करें। पहले 32 बाइट्स पढ़ें और ftyp बॉक्स को पार्स करें।

वैध HEIC फ़ाइल हेडर का सटीक बाइट लेआउट:

Bytes 0–3:   बॉक्स आकार (बिग-एंडियन uint32)
Bytes 4–7:   बॉक्स प्रकार: "ftyp" (0x66 0x74 0x79 0x70)
Bytes 8–11:  मेजर ब्रांड: "heic" या "heif" या "mif1"
Bytes 12–15: माइनर संस्करण (आमतौर पर 0x00000000)
Bytes 16+:   संगत ब्रांड सूची (जैसे "mif1", "heic", "MiHE")

ब्राउज़र-साइड TypeScript:

async function isHeic(file: File): Promise<boolean> {
  const buffer = await file.slice(0, 32).arrayBuffer()
  const bytes = new Uint8Array(buffer)

  if (String.fromCharCode(...bytes.slice(4, 8)) !== "ftyp") return false

  const brand = String.fromCharCode(...bytes.slice(8, 12))
  return ["heic", "heif", "mif1", "msf1"].includes(brand)
}

हमारा कनवर्टर डिकोडिंग का प्रयास करने से पहले यह जाँच करता है। गलत ब्रांड = तुरंत अस्वीकार। CPU बर्बाद नहीं होता।

Python

def is_heic(path: str) -> bool:
    with open(path, "rb") as f:
        header = f.read(32)

    if len(header) < 12:
        return False

    if header[4:8].decode("ascii", errors="ignore") != "ftyp":
        return False

    return header[8:12].decode("ascii", errors="ignore") in {"heic", "heif", "mif1", "msf1"}

filetype के साथ उच्च-स्तरीय जाँच:

import filetype

kind = filetype.guess("photo.heic")
if kind and kind.extension in ("heic", "heif"):
    print(kind.mime)  # image/heic

या pillow-heif के साथ:

from pillow_heif import is_heif

if is_heif("photo.heic"):
    # वैध कंटेनर
    pass

Go

func isHeic(path string) bool {
	f, err := os.Open(path)
	if err != nil {
		return false
	}
	defer f.Close()

	buf := make([]byte, 32)
	if _, err := f.Read(buf); err != nil {
		return false
	}

	if string(buf[4:8]) != "ftyp" {
		return false
	}

	brand := string(buf[8:12])
	return brand == "heic" || brand == "heif" || brand == "mif1" || brand == "msf1"
}

PHP

function isHeic(string $path): bool {
    $header = file_get_contents($path, false, null, 0, 32);
    if (strlen($header) < 12) return false;
    if (substr($header, 4, 4) !== 'ftyp') return false;

    return in_array(substr($header, 8, 4), ['heic', 'heif', 'mif1', 'msf1'], true);
}

fileinfo के साथ:

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file('photo.heic');
// image/heic या image/heif

ImageMagick CLI

ImageMagick 7+ libheif के साथ संकलित होने पर HEIC का समर्थन करता है:

magick identify -verbose photo.heic | grep "Format:"
# Format: HEIC (High Efficiency Image Container)

libheif के बिना: no decode delegate for this image format। अधिकांश Linux वितरणों पर, libheif-examples स्थापित करने से विकल्प के रूप में heif-convert मिलता है।

रूपांतरण पथ

यह जानना कि कोई फ़ाइल HEIC है, उसे खोलने की गारंटी नहीं देता। Windows को Microsoft Store से HEIF Image Extensions की आवश्यकता होती है। अधिकांश ब्राउज़र अभी भी <img> टैग में HEIC रेंडर करने से इनकार करते हैं। Android 9+ इसे मूल रूप से संभालता है; पुराने डिवाइस नहीं।

समाधान: रूपांतरित करें। हमारा HEIC से JPG कनवर्टर आपके ब्राउज़र में पूरी पाइपलाइन को संभालता है:

  1. फ़ाइलें ड्रॉप करें — एकल फोटो या पूरे फ़ोल्डर, बैच प्रोसेसिंग स्वचालित है।
  2. हस्ताक्षर सत्यापन — ऊपर दिखाया गया सटीक बाइट-रीडिंग लॉजिक हर फ़ाइल पर चलता है। गैर-HEIC फ़ाइलें तुरंत स्पष्ट संदेश के साथ अस्वीकार कर दी जाती हैं।
  3. क्लाइंट-साइड डिकोडिंग — libheif का WebAssembly बिल्ड स्थानीय रूप से चलता है। कोई अपलोड नहीं। कोई सर्वर नहीं।
  4. गुणवत्ता-संरक्षण आउटपुट — 90% गुणवत्ता वाला JPG मूल रिज़ॉल्यूशन और रंग सटीकता बनाए रखता है।
  5. बैच डाउनलोड — व्यक्तिगत फ़ाइलें या एकल ZIP संग्रह।

पारदर्शिता के साथ लॉसलेस आउटपुट के लिए: HEIC से PNG। वेब-अनुकूलित आकारों के लिए: HEIC से WebP

आपकी फ़ाइलें कभी भी आपके डिवाइस को नहीं छोड़तीं। यही मुद्दा है।

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