Image processing ၏နယ်ပယ်တွင် PNG (အိတ်ဆောင်ကွန်ယက်ဂရပ်ဖစ်) သည်ကျယ်ပြန့်စွာအသုံးပြုသောဆုံးရှုံးမှုမရှိသော compressed image format ဖြစ်သည်။ ၎င်း၏ဖိုင်ဖွဲ့စည်းပုံတွင် "chunks" များအပါအ 0 င်ရှင်းလင်းသောအသေးစိတ်အချက်အလက်များရှိသည်။ ဤအဆောက်အအုံများကိုနားလည်ခြင်းသည်စိတ်ကြိုက်ပုံရိပ်ကိုပြုပြင်ခြင်းကိရိယာများကိုဖွံ့ဖြိုးတိုးတက်ရန်သာမက Binary Data စစ်ဆင်ရေးနှင့် protocol ဒီဇိုင်းကိုလေ့လာရန်အလွန်အကျိုးရှိသည်။
ဤဆောင်းပါးသည် PPP ၏ POSP () အထုပ် () functack () functack () functack () functions မှတဆင့် PNG ဖိုင်၏ header ကိုကိုယ်တိုင်ခွဲခြမ်းစိတ်ဖြာလိမ့်မည်။ PHP သည်ဝက်ဘ်အခြေပြုဘာသာစကားဖြစ်သော်လည်း Binary Data ကိုလုပ်ဆောင်ရာတွင်အလွန်ကောင်းမွန်သောစွမ်းရည်များလည်းရှိသည်။
တရားဝင် PNG ဖိုင်သည် 8 byte ပုံသေလက်မှတ်ဖြင့်စတင်ရမည်။
89 50 4E 47 0D 0A 1A 0A
နောက်တစ်ခုကအောက်ပါအစိတ်အပိုင်းများပါ 0 င်သည့်လုပ်ကွက်တစ်ခု (သို့) တစ်ခုထက် ပို. ရှိသည်။
အရှည် (4 bytes) - ဒေတာအပိုင်း၏အရှည်
IHDR, IDAT, Iend ကဲ့သို့သောအမျိုးအစား (4 bytes) ကိုပိတ်ပင်တားဆီးမှုအမျိုးအစား (4 bytes) စသည်တို့ဖြစ်သည်။
Data Data (variable)
CRC စိစစ်အတည်ပြုခြင်း (4 bytes)
အောက်ပါဥပမာကုဒ်သည် PNG ဖိုင်၏ပထမဆုံး bytes များစွာကိုဖတ်ပြီးဖိုင်ခေါင်းစဉ်နှင့်ပထမ ဦး ဆုံးလုပ်ကွက် (များသောအားဖြင့် iHDR) ကိုထုတ်ယူသည်။
<?php
$filename = 'https://m66.net/sample.png';
// ဖိုင်ကိုမဖတ်မီ 33 ဒရယ်:8 ဒရယ်လက်မှတ်ရေးထိုး + 4+4+13+4(IHDR စုစုပေါင်းပိတ်ပင်တားဆီးမှုအရှည်)
$data = file_get_contents($filename, false, null, 0, 33);
if ($data === false || strlen($data) < 33) {
die("ဖတ်လို့မရပါဘူး PNG ဖိုင်သို့မဟုတ်ဖိုင်ငယ်လေး。");
}
// သုံးသပ်ကြည့်ရှုခြင်း PNG လက်မှတ်ရေးထိုး
$signature = substr($data, 0, 8);
$expectedSignature = "\x89PNG\r\n\x1a\n";
if ($signature !== $expectedSignature) {
die("ဒါကခိုင်လုံတဲ့တစ်ခုမဟုတ်ပါဘူး PNG စာချုပ်စာတမ်း。");
}
echo "PNG လက်မှတ်ရေးထိုး验证成功。\n";
// သုံးသပ်ကြည့်ရှုခြင်း第一个 Chunk(ဖြစ်သင့်သည် IHDR)
$chunkData = substr($data, 8);
// အသုံးပြု unpack လယ်ကွင်းထုတ်ယူ
$unpacked = unpack("Nlength/A4type", substr($chunkData, 0, 8));
$length = $unpacked['length'];
$type = $unpacked['type'];
echo "ပထမ ဦး ဆုံးပိတ်ပင်တားဆီးမှုအမျိုးအစား: $type\n";
echo "ဒေတာအရှည်: $length\n";
// ထုတ်ပြန် IHDR အချက်များ
$ihdrData = substr($chunkData, 8, 13);
$ihdr = unpack("Nwidth/Nheight/CbitDepth/CcolorType/Ccompression/Cfilter/Cinterlace", $ihdrData);
echo "ကျယ်ဝန်းခြင်း: {$ihdr['width']} px\n";
echo "မြင့်သော: {$ihdr['height']} px\n";
echo "နက်သော: {$ihdr['bitDepth']}\n";
echo "အရောင်အမျိုးအစား: {$ihdr['colorType']}\n";
echo "compression နည်းလမ်း: {$ihdr['compression']}\n";
echo "filter နည်းလမ်း: {$ihdr['filter']}\n";
echo "interlaced စကင်ဖတ်စစ်ဆေးမှု: {$ihdr['interlace']}\n";
?>
Unpack () binary data ကို PHP Arrays သို့ခွဲခြမ်းစိတ်ဖြာရန်အသုံးပြုသည်။ ၎င်းသည်ကွင်းတစ်ခုစီ၏အမျိုးအစားနှင့်အမိန့်ကိုဖော်ပြရန် format string ကိုအသုံးပြုသည်။ ဥပမာအားဖြင့်:
unpack("Nlength/A4type", $binary);
NLength ဆိုသည်မှာ endian endien-andigned long otheger (4 bytes),
A4Type ဆိုသည်မှာ ASCII string (4 bytes) အမည်ရှိ ascii string ကိုဖတ်ခြင်းဖြစ်သည်
အဲဒီအစား pack () variable တွေကို binary format နဲ့ထုပ်ပိုးနိုင်ပါတယ်။ ဥပမာအားဖြင့် Pngly PNG ဖိုင်ခေါင်းစဉ်များကိုထုပ်ပိုးသည့်အခါသင်အသုံးပြုနိုင်သည်။
$signature = pack("C8", 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A);
PNG ဖိုင်များအားစိတ်ကြိုက်ပြုပြင်သည့်အခါ၎င်းသည်အလွန်အသုံးဝင်သည်။
နောက်ဆက်တွဲ PNG လုပ်ကွက်များ (ဥပမာ IDAT, IDED စသဖြင့်) parsing parsing parsing ရန်, ပိတ်ပင်တားဆီးမှုတစ်ခုချင်းစီကိုအောက်ပါအတိုင်းကွင်းဆက် loop ကိုကြည့်ပါ။
8 bytes: 4 byte အရှည် + 4 byte အမျိုးအစား
အလျားအရသက်ဆိုင်ရာအချက်အလက်များကိုဖတ်ပါ
4 byte CRC စစ်ဆေးမှုများကို skip
Iend ကြုံတွေ့သည်အထိနောက် bade ကိုဆက်လက်ဖတ်ရှုပါ
ဤခွဲခြမ်းစိတ်ဖြာခြင်းနည်းလမ်းကို Transparency (TRNS), အရောင် palette (plte) နှင့်အခြားလုပ်ကွက်များကဲ့သို့သောပိုမိုရှုပ်ထွေးသော PNG ၏ဝိသေသလက္ခဏာများကိုလည်းအသုံးချနိုင်သည်။
PHP ၏ ဖြန့်ချိ () နှင့် ထုပ်ပိုးခြင်း () functions များကိုအသုံးပြုခြင်းအားဖြင့်ကျွန်ုပ်တို့သည် PNG ဖိုင်များကိုအဆင့်နိမ့်ကျသောနည်းဖြင့်အလွယ်တကူခွဲခြမ်းစိတ်ဖြာနိုင်ပြီးသူတို့၏အခြေခံဖွဲ့စည်းပုံကိုနားလည်နိုင်သည်။ ဤကျွမ်းကျင်မှုသည်ရုပ်ပုံပုံစံများကိုအသေးစိတ်နားလည်ရန်အတွက်အလွန်အသုံးဝင်သည်, စိတ်ကြိုက်ရုပ်ပုံများပြုပြင်ခြင်းကိရိယာများကိုရေးသားခြင်းသို့မဟုတ်သက်ဆိုင်ရာလုံခြုံရေးကိရိယာများကိုရေးခြင်း ဤကျွမ်းကျင်မှုများကိုကျွမ်းကျင်ခြင်းသည်နေ့စဉ် PHP ဖွံ့ဖြိုးတိုးတက်မှုတွင်ပိုမိုအဆင်ပြေစေနိုင်သည်။