อ่าน 8 นาที
รูปแบบไฟล์ BMP
รูป แบบไฟล์ BMP หรือ บิตแมป เป็น รูปแบบไฟล์ ภาพกราฟิกแรสเตอร์ ที่ใช้ในการจัดเก็บ ภาพดิจิทัล บิตแมป โดยไม่ขึ้นอยู่กับ อุปกรณ์แสดงผล (เช่น อะ แดปเตอร์กราฟิก )...
รูปแบบไฟล์ BMP
| วินโดว์ บิตแมป | |
|---|---|
| นามสกุลไฟล์ | .bmp,.dib |
| สื่อประเภทอินเทอร์เน็ต | image/bmp[ 1 ]image/x-bmp |
| รหัสประเภท | 'BMP ''BMPf''BMPp' |
| ตัวระบุประเภทมาตรฐาน (UTI) | com.microsoft.bmp |
| พัฒนาโดย | บริษัท ไมโครซอฟต์ |
| ประเภทของรูปแบบ | กราฟิกแรสเตอร์ |
| รูปแบบเปิด ? | OSPสำหรับWMF |
รูปแบบไฟล์ BMPหรือบิตแมปเป็นรูปแบบไฟล์ภาพกราฟิกแรสเตอร์ ที่ใช้ในการจัดเก็บภาพดิจิทัลบิตแมปโดยไม่ขึ้นอยู่กับอุปกรณ์แสดงผล (เช่น อะแดปเตอร์กราฟิก ) โดยเฉพาะในระบบปฏิบัติการ Microsoft Windows [ 2 ]และOS/2 [ 3 ]
รูปแบบไฟล์ BMP สามารถจัดเก็บภาพดิจิทัลสองมิติ ที่มี ความลึกสี ต่างๆ ได้ และอาจมี การบีบ อัดข้อมูลช่องอัลฟาและโปรไฟล์สีเพิ่มเติม ข้อกำหนด Windows Metafile (WMF) ครอบคลุมรูปแบบไฟล์ BMP [ 4 ]
บิตแมปที่ไม่ขึ้นกับอุปกรณ์และรูปแบบไฟล์ BMP
ไมโครซอฟต์ได้กำหนดรูปแบบการแสดงภาพบิตแมปสีที่มีความลึกของสีแตกต่างกันโดยเฉพาะ เพื่อช่วยในการแลกเปลี่ยนภาพบิตแมประหว่างอุปกรณ์และแอปพลิเคชันที่มีรูปแบบการแสดงผลภายในที่หลากหลาย พวกเขาเรียกภาพบิตแมปเหล่านี้ว่า ภาพบิตแมปที่ไม่ขึ้นกับอุปกรณ์ หรือ DIB และรูปแบบไฟล์สำหรับภาพเหล่านี้เรียกว่า รูปแบบไฟล์ DIB หรือ รูปแบบไฟล์ภาพ BMP
ตามการสนับสนุนของ Microsoft: [ 5 ]
ไฟล์ภาพบิตแมปที่ไม่ขึ้นกับอุปกรณ์ (DIB) เป็นรูปแบบที่ใช้กำหนดภาพบิตแมปที่ไม่ขึ้นกับอุปกรณ์ในความละเอียดสีต่างๆ จุดประสงค์หลักของ DIB คือการอนุญาตให้ย้ายภาพบิตแมปจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่งได้ (จึงเป็นที่มาของคำว่า "ไม่ขึ้นกับอุปกรณ์" ในชื่อ) DIB เป็นรูปแบบภายนอก ซึ่งแตกต่างจากภาพบิตแมปที่ขึ้นกับอุปกรณ์ ซึ่งปรากฏในระบบเป็นวัตถุภาพบิตแมป (สร้างโดยแอปพลิเคชัน...) โดยปกติแล้ว DIB จะถูกส่งผ่านไฟล์เมตา (โดยทั่วไปใช้ฟังก์ชัน StretchDIBits()) ไฟล์ BMP และคลิปบอร์ด ( รูปแบบข้อมูล CF_DIB )
ส่วนต่อไปนี้จะกล่าวถึงข้อมูลที่จัดเก็บในไฟล์ BMP หรือ DIB โดยละเอียด นี่คือรูปแบบไฟล์ BMP มาตรฐาน[ 5 ]แอปพลิเคชันบางตัวสร้างไฟล์ภาพบิตแมปที่ไม่สอดคล้องกับเอกสารของ Microsoft นอกจากนี้ ฟิลด์บางฟิลด์ไม่ได้ถูกใช้งาน ค่า 0 จะถูกพบในฟิลด์ที่ไม่ได้ใช้งานเหล่านี้
โครงสร้างไฟล์
ไฟล์ภาพบิตแมปประกอบด้วยโครงสร้างขนาดคงที่ (ส่วนหัว) และโครงสร้างขนาดแปรผันที่ปรากฏตามลำดับที่กำหนดไว้ล่วงหน้า เนื่องจากรูปแบบไฟล์นี้มีการพัฒนามาอย่างยาวนาน จึงอาจมีโครงสร้างบางส่วนที่แตกต่างกันหลายเวอร์ชันปรากฏอยู่ในไฟล์เดียวกัน
จากแผนภาพที่ 1 ไฟล์บิตแมปประกอบด้วยโครงสร้างตามลำดับดังต่อไปนี้:
| ชื่อโครงสร้าง | ไม่จำเป็น | ขนาด (ไบต์) | วัตถุประสงค์ | ความคิดเห็น |
|---|---|---|---|---|
| ส่วนหัวของไฟล์บิตแมป | เลขที่ | 14 | ข้อมูลทั่วไป | ไม่จำเป็นอีกต่อไปหลังจากโหลดไฟล์ลงในหน่วยความจำแล้ว |
| ส่วนหัว DIB | เลขที่ | ขนาดคงที่(มีให้เลือก 7 แบบ) | ข้อมูลโดยละเอียดและรูปแบบพิกเซล | ต่อจากส่วนหัวของไฟล์ Bitmap ทันที |
| หน้ากากบิตเพิ่มเติม | ใช่ | 12 หรือ 16 | รูปแบบพิกเซล | จะปรากฏเฉพาะในกรณีที่ส่วนหัวของไฟล์ DIB คือBITMAPINFOHEADERและสมาชิก Compression Method ถูกตั้งค่าเป็น BI_BITFIELDS หรือ BI_ALPHABITFIELDS เท่านั้น |
| ตารางสี | พึ่งพา | แตกต่างกันไป | สี (อาร์เรย์พิกเซล) | จำเป็นสำหรับความลึกของสี ≤ 8 บิต |
| ช่องว่าง 1 | ใช่ | แตกต่างกันไป | การจัดเรียงโครงสร้าง | สิ่งผิดปกติของอาร์เรย์ค่าชดเชยไฟล์เป็นพิกเซลในส่วนหัวของไฟล์บิตแมป |
| อาร์เรย์พิกเซล | เลขที่ | แตกต่างกันไป | ค่าพิกเซล | รูปแบบพิกเซลถูกกำหนดโดยส่วนหัว DIB หรือบิตมาสก์เพิ่มเติม แต่ละแถวในอาร์เรย์พิกเซลจะถูกเติมให้มีขนาดเป็นจำนวนเท่าของ 4 ไบต์ |
| แก๊ป2 | ใช่ | แตกต่างกันไป | การจัดเรียงโครงสร้าง | ร่องรอยของฟิลด์ออฟเซ็ตข้อมูลโปรไฟล์ ICC ในส่วนหัว DIB |
| โปรไฟล์สี ICC | ใช่ | แตกต่างกันไป | โปรไฟล์สี (สำหรับการจัดการสี) | นอกจากนี้ยังสามารถมีเส้นทางไปยังไฟล์ภายนอกที่มีโปรไฟล์สี เมื่อโหลดในหน่วยความจำเป็น "DIB ที่ไม่ได้บรรจุ" จะอยู่ระหว่างตารางสีและ Gap1 [ 6 ] |
DIB ในหน่วยความจำ
ไฟล์ภาพบิตแมปที่โหลดลงในหน่วยความจำจะกลายเป็นโครงสร้างข้อมูล DIB ซึ่งเป็นส่วนประกอบสำคัญของ Windows GDI API โครงสร้างข้อมูล DIB ในหน่วยความจำนั้นเกือบจะเหมือนกับรูปแบบไฟล์ BMP แต่ไม่มีส่วนหัวไฟล์บิตแมปขนาด 14 ไบต์ และเริ่มต้นด้วยส่วนหัว DIB สำหรับ DIB ที่โหลดลงในหน่วยความจำ ตารางสีอาจประกอบด้วยรายการ 16 บิตที่ประกอบเป็นดัชนีไปยังจานสีที่รับรู้ในปัจจุบัน[ 7 ] (ระดับการอ้างอิงเพิ่มเติม) แทนที่จะเป็นการกำหนดสี RGB อย่างชัดเจน ในทุกกรณี อาร์เรย์พิกเซลต้องเริ่มต้นที่ที่อยู่หน่วยความจำที่เป็นพหุคูณของ 4 ไบต์ ใน DIB ที่ไม่ได้บรรจุซึ่งโหลดลงในหน่วยความจำ ข้อมูลโปรไฟล์สีเสริมควรอยู่ถัดจากตารางสีทันทีและก่อน gap1 และอาร์เรย์พิกเซล[ 6 ] (ต่างจากในแผนภาพที่ 1)
เมื่อขนาดของ gap1 และ gap2 เป็นศูนย์ โครงสร้างข้อมูล DIB ในหน่วยความจำมักจะเรียกว่า "packed DIB" และสามารถอ้างอิงได้ด้วยตัวชี้เดียวที่ชี้ไปยังจุดเริ่มต้นของส่วนหัว DIB ในทุกกรณี อาร์เรย์พิกเซลต้องเริ่มต้นที่ที่อยู่หน่วยความจำที่เป็นพหุคูณของ 4 ไบต์ ในบางกรณี อาจจำเป็นต้องปรับจำนวนรายการในตารางสีเพื่อบังคับให้ที่อยู่หน่วยความจำของอาร์เรย์พิกเซลเป็นพหุคูณของ 4 ไบต์[ 7 ] สำหรับ "packed DIBs" ที่โหลดในหน่วยความจำ ข้อมูลโปรไฟล์สีเสริมควรตามหลังอาร์เรย์พิกเซลทันที ดังที่แสดงในแผนภาพที่ 1 (โดย gap1=0 และ gap2=0) [ 6 ] "Packed DIBs" จำเป็นสำหรับ ฟังก์ชัน API คลิปบอร์ด ของ Windowsเช่นเดียวกับฟังก์ชันแปรงและทรัพยากรแบบมีรูปแบบของ Windows บางฟังก์ชัน[ 8 ]
ส่วนหัวของไฟล์บิตแมป
กลุ่มไบต์นี้อยู่ตอนต้นของไฟล์และใช้เพื่อระบุไฟล์ โดยทั่วไปแล้วแอปพลิเคชันจะอ่านกลุ่มไบต์นี้ก่อนเพื่อให้แน่ใจว่าไฟล์นั้นเป็นไฟล์ BMP จริงและไม่เสียหาย ไบต์ 2 ไบต์แรกของรูปแบบไฟล์ BMP คืออักขระ "B" แล้วตามด้วยอักขระ "M" ใน การเข้ารหัส ASCIIค่าจำนวนเต็มทั้งหมดจะถูกจัดเก็บใน รูปแบบ little-endian (กล่าวคือไบต์ที่มีค่าน้อยที่สุดจะอยู่ก่อน)
| ออฟเซ็ต (ไบต์) | ขนาด (ไบต์) | คำอธิบาย |
|---|---|---|
| 0 | 2 | ส่วนหัวของไฟล์ BMP และ DIB นั้นอยู่0x42 0x4Dใน รูป แบบเลขฐานสิบหกเช่นเดียวกับBMใน ASCII โดยมีค่าที่เป็นไปได้ดังต่อไปนี้:
|
| 2 | 4 | ขนาดของไฟล์ BMP ในหน่วยไบต์ |
| 6 | 2 | สงวนไว้; ค่าจริงขึ้นอยู่กับแอปพลิเคชันที่สร้างภาพ หากสร้างด้วยตนเอง ค่าอาจเป็น 0 |
| 8 | 2 | สงวนไว้; ค่าจริงขึ้นอยู่กับแอปพลิเคชันที่สร้างภาพ หากสร้างด้วยตนเอง ค่าอาจเป็น 0 |
| 10 | 4 | ค่าออฟเซ็ต หรือที่อยู่เริ่มต้นของไบต์ที่สามารถพบข้อมูลภาพบิตแมป (อาร์เรย์พิกเซล) ได้ |
ส่วนหัว DIB (ส่วนหัวข้อมูลบิตแมป)
บล็อกไบต์นี้จะบอกข้อมูลโดยละเอียดเกี่ยวกับรูปภาพแก่แอปพลิเคชัน ซึ่งจะใช้ในการแสดงรูปภาพบนหน้าจอ บล็อกนี้ยังตรงกับส่วนหัวที่ใช้ภายในโดย Windows และ OS/2 และมีหลายรูปแบบที่แตกต่างกัน ทุกรูปแบบจะมีฟิลด์ dword (32 บิต) ที่ระบุขนาด เพื่อให้แอปพลิเคชันสามารถระบุได้ง่ายว่าใช้ส่วนหัวใดในรูปภาพ เหตุผลที่มีส่วนหัวที่แตกต่างกันคือ Microsoft ได้ขยายรูปแบบ DIB หลายครั้ง ส่วนหัวที่ขยายใหม่สามารถใช้กับฟังก์ชัน GDI บางอย่างแทนส่วนหัวแบบเก่า ทำให้มีฟังก์ชันการทำงานมากขึ้น เนื่องจาก GDI รองรับฟังก์ชันสำหรับการโหลดไฟล์บิตแมป แอปพลิเคชัน Windows ทั่วไปจึงใช้ฟังก์ชันนั้น ผลที่ตามมาอย่างหนึ่งคือ สำหรับแอปพลิเคชันดังกล่าว รูปแบบ BMP ที่พวกเขารองรับจะตรงกับรูปแบบที่รองรับโดยเวอร์ชัน Windows ที่ใช้งานอยู่ ดูตารางด้านล่างสำหรับข้อมูลเพิ่มเติม
| ขนาด (ไบต์) | ชื่อส่วนหัว | การสนับสนุนระบบปฏิบัติการ | คุณสมบัติ | เขียนโดย |
|---|---|---|---|---|
| 12 | BITMAPCOREHEADER OS21XBITMAPHEADER | Windows 2.0หรือเวอร์ชันที่ใหม่กว่าOS/2 1.x [ 3 ] | ||
| 64 | OS22XBITMAPHEADER | OS/2 บิตแมปคอร์เฮดเดอร์ 2 | เพิ่มเอฟเฟ็กต์ฮาล์ฟโทนเพิ่ม การบีบอัด RLEและHuffman 1D | |
| 16 | OS22XBITMAPHEADER | รูปแบบนี้ของส่วนหัวก่อนหน้านี้ประกอบด้วยไบต์ 16 ไบต์แรกเท่านั้น และไบต์ที่เหลือจะถือว่าเป็นค่าศูนย์[ 3 ] ตัวอย่างกรณีดังกล่าวคือกราฟิกpal8os2v2-16.bmp [ 9 ] ของ BMP Suite [ 10 ] | ||
| 40 | บิตแมปโฟเฮดเดอร์ | Windows NTเวอร์ชัน3.1xหรือใหม่กว่า[ 2 ] | ขยายความกว้างและความสูงของบิตแมปเป็น 4 ไบต์ เพิ่มรูปแบบ 16 บิตต่อพิกเซลและ 32 บิตต่อพิกเซล เพิ่มการบีบอัดแบบ RLE | |
| 52 | บิตแมปวี2อินโฟเฮดเดอร์ | ไม่มีเอกสาร | เพิ่มบิตมาสก์ RGB | ไมโครซอฟต์ |
| 56 | บิตแมปวี3อินโฟเฮดเดอร์ | ไม่มีการจัดทำเอกสารอย่างเป็นทางการ แต่เอกสารนี้ถูกโพสต์ในฟอรัมของ Adobe โดยพนักงานของ Adobe พร้อมคำแถลงว่ามาตรฐานดังกล่าวเคยรวมอยู่ในเอกสารอย่างเป็นทางการของ MS ในอดีต[ 11 ] | เพิ่มบิตมาสก์ ช่องอัลฟา | ไมโครซอฟต์ |
| 108 | บิตแมปวี4เฮดเดอร์ | ระบบปฏิบัติการ Windows NT 4.0 , 95หรือเวอร์ชันที่ใหม่กว่า | เพิ่มประเภทพื้นที่สีและการแก้ไขแกมมา | |
| 124 | BITMAPV5HEADER | ระบบปฏิบัติการ Windows NT 5.0 , 98หรือเวอร์ชันที่ใหม่กว่า | เพิ่มโปรไฟล์สี ICC | จีเอ็มพี |
| ออฟเซ็ต (ไบต์) | ขนาด (ไบต์) | OS/2 1.x BITMAPCOREHEADER [ 3 ] |
|---|---|---|
| 14 | 4 | ขนาดของส่วนหัวนี้ (12 ไบต์) |
| 18 | 2 | ความกว้างของภาพบิตแมปในหน่วยพิกเซล (16 บิตแบบไม่ระบุเครื่องหมาย) |
| 20 | 2 | ความสูงของภาพบิตแมปในหน่วยพิกเซล (16 บิตแบบไม่ระบุเครื่องหมาย) |
| 22 | 2 | จำนวนระนาบสีต้องมี 1 |
| 24 | 2 | จำนวนบิตต่อพิกเซล |
BITMAPCOREHEADER ของ Windows 2.x แตกต่างจาก BITMAPCOREHEADER ของ OS/2 1.x (แสดงในตารางด้านบน) ในรายละเอียดหนึ่งข้อคือ ฟิลด์ความกว้างและความสูงของภาพเป็นจำนวนเต็มที่มีเครื่องหมาย ไม่ใช่จำนวนเต็มที่ไม่มีเครื่องหมาย[ 12 ]
เวอร์ชันหลังจากBITMAPINFOHEADERจะเพิ่มฟิลด์ต่อท้ายส่วนหัวของเวอร์ชันก่อนหน้าเท่านั้น ตัวอย่างเช่นBITMAPV2INFOHEADERจะเพิ่มฟิลด์ต่อจากBITMAPINFOHEADERและBITMAPV3INFOHEADERจะเพิ่มฟิลด์ต่อจาก BITMAPV2INFOHEADER
มีการนำช่องอัลฟาแบบบูรณาการมาใช้ในBITMAPV3INFOHEADER ที่ไม่ได้ระบุไว้ในเอกสาร และในBITMAPV4HEADER ที่ระบุไว้ในเอกสาร (ตั้งแต่Windows 95 ) และถูกใช้ใน ระบบล็อกอินและธีม ของ Windows XPรวมถึง Microsoft Office (ตั้งแต่เวอร์ชัน 2000) นอกจากนี้ยังรองรับโดย ซอฟต์แวร์ แก้ไขภาพ บางตัว เช่นAdobe Photoshopตั้งแต่เวอร์ชัน 7 และAdobe Flashตั้งแต่เวอร์ชัน MX 2004 (ซึ่งในขณะนั้นรู้จักกันในชื่อ Macromedia Flash) และยังรองรับโดยGIMP , Google Chrome , Microsoft PowerPointและ Microsoft Word อีกด้วย
ด้วยเหตุผลด้านความเข้ากันได้ แอปพลิเคชันส่วนใหญ่จึงใช้ส่วนหัว DIB รุ่นเก่าในการบันทึกไฟล์เนื่องจากระบบปฏิบัติการ OS/2 ไม่ได้รับการสนับสนุนอีกต่อไปหลังจาก Windows 2000 รูปแบบที่ใช้กันทั่วไปใน Windows ในขณะนี้คือส่วนหัวBITMAPINFOHEADERโปรดดูรายละเอียดในตารางถัดไป ค่าทั้งหมดจะถูกจัดเก็บเป็นจำนวนเต็มที่ไม่ติดลบ เว้นแต่จะระบุไว้เป็นอย่างอื่น
| ออฟเซ็ต (ไบต์) | ขนาด (ไบต์) | Windows BITMAPINFOHEADER [ 2 ] |
|---|---|---|
| 14 | 4 | ขนาดของส่วนหัวนี้เป็นไบต์ (40) |
| 18 | 4 | ความกว้างของภาพบิตแมปในหน่วยพิกเซล (จำนวนเต็มที่มีเครื่องหมาย) |
| 22 | 4 | ความสูงของภาพบิตแมปในหน่วยพิกเซล (จำนวนเต็มที่มีเครื่องหมาย) |
| 26 | 2 | จำนวนระนาบสี (ต้องเป็น 1) |
| 28 | 2 | จำนวนบิตต่อพิกเซล ซึ่งก็คือความลึกของสีในภาพ ค่าทั่วไปคือ 1, 4, 8, 16, 24 และ 32 |
| 30 | 4 | วิธีการบีบอัดที่ใช้ ดูตารางถัดไปสำหรับรายการค่าที่เป็นไปได้ |
| 34 | 4 | ขนาดของภาพ นี่คือขนาดของข้อมูลบิตแมปดิบ สามารถกำหนดค่า 0 แทนได้สำหรับบิตแมป BI_RGB |
| 38 | 4 | ความละเอียดในแนวนอนของภาพ (พิกเซลต่อเมตร จำนวนเต็มบวกมีเครื่องหมาย) |
| 42 | 4 | ความละเอียดในแนวตั้งของภาพ (พิกเซลต่อเมตร จำนวนเต็มบวกมีเครื่องหมาย) |
| 46 | 4 | จำนวนสีในจานสี หรือ 0 เพื่อตั้งค่าเริ่มต้นเป็น 2 สี |
| 50 | 4 | จำนวนสีสำคัญที่ใช้ หรือ 0 เมื่อทุกสีมีความสำคัญ โดยทั่วไปมักไม่นับรวม |
วิธีการบีบอัด (ออฟเซ็ต 30) สามารถเป็นได้ดังนี้:
| ค่า | ระบุโดย | วิธีการบีบอัด | ความคิดเห็น |
|---|---|---|---|
| 0 | BI_RGB | ไม่มี | พบได้บ่อยที่สุด |
| 1 | BI_RLE8 | RLE 8 บิต/พิกเซล | ใช้ได้เฉพาะกับภาพบิตแมป 8 บิต/พิกเซลเท่านั้น |
| 2 | BI_RLE4 | RLE 4 บิต/พิกเซล | ใช้ได้เฉพาะกับภาพบิตแมป 4 บิต/พิกเซลเท่านั้น |
| 3 | BI_BITFIELDS | OS22XBITMAPHEADER : Huffman 1D | BITMAPV2INFOHEADER : หน้ากากฟิลด์บิต RGB, BITMAPV3INFOHEADER + : RGBA |
| 4 | บีไอ_เจพีอีจี | OS22XBITMAPHEADER : RLE-24 | BITMAPV4INFOHEADER + : รูปภาพ JPEGสำหรับการพิมพ์ [ 13 ] |
| 5 | BI_PNG | BITMAPV4INFOHEADER + : รูปภาพ PNGสำหรับการพิมพ์ [ 13 ] | |
| 6 | BI_ALPHABITFIELDS | มาสก์ฟิลด์บิต RGBA | เฉพาะWindows CE 5.0 ที่มี .NET 4.0 หรือเวอร์ชันที่ใหม่กว่าเท่านั้น |
| 11 | บีไอ_ซีมายค์ | ไม่มี | เฉพาะWindows Metafile CMYK [ 4 ] |
| 12 | BI_CMYKRLE8 | อาร์แอลเอ-8 | เฉพาะWindows Metafile CMYK เท่านั้น |
| 13 | BI_CMYKRLE4 | อาร์แอลอี-4 | เฉพาะWindows Metafile CMYK เท่านั้น |
OS/2 2.x OS22XBITMAPHEADER ( BITMAPINFOHEADER2ในเอกสารของ IBM) มีไบต์เพิ่มเติม 24 ไบต์: [ 3 ]
| ออฟเซ็ต (ไบต์) | ขนาด (ไบต์) | OS/2 OS22XBITMAPHEADER ( BITMAPINFOHEADER2 ) [ 3 ] |
|---|---|---|
| 54 | 2 | ค่าที่ระบุหน่วยสำหรับความละเอียดแนวนอนและแนวตั้ง (ค่าชดเชย 38 และ 42) ค่าที่กำหนดไว้เพียงค่าเดียวคือ 0 ซึ่งหมายถึงพิกเซลต่อเมตร |
| 56 | 2 | ระยะห่าง (Padding) จะถูกละเลยและควรเป็นศูนย์ |
| 58 | 2 | ค่าที่กำหนดไว้ซึ่งระบุทิศทางการเติมบิตลงในบิตแมป ค่าที่กำหนดไว้เพียงค่าเดียวคือ 0 ซึ่งหมายความว่าจุดเริ่มต้นอยู่ที่มุมล่างซ้าย บิตจะถูกเติมจากซ้ายไปขวา จากนั้นจากล่างขึ้นบน โปรดทราบว่าภาพบิตแมปของ Windows (ซึ่งไม่มีฟิลด์นี้) สามารถระบุจุดเริ่มต้นที่มุมบนซ้ายได้เช่นกัน (บิตจะถูกเติมจากซ้ายไปขวา จากนั้นจากบนลงล่าง) โดยใช้ค่าลบสำหรับความสูงของภาพ |
| 60 | 2 | ค่าที่ระบุซึ่งใช้ในการสร้างภาพแบบฮาล์ฟโทน |
| 62 | 4 | พารามิเตอร์การสร้างภาพแบบฮาล์ฟโทน 1 (ดูด้านล่าง) |
| 66 | 4 | พารามิเตอร์การสร้างภาพแบบฮาล์ฟโทน 2 (ดูด้านล่าง) |
| 70 | 4 | ค่าที่ระบุการเข้ารหัสสีสำหรับแต่ละรายการในตารางสี โดยมีค่าคงที่เพียงค่าเดียวคือ 0 ซึ่งหมายถึง RGB |
| 74 | 4 | ตัวระบุที่กำหนดโดยแอปพลิเคชัน ไม่ได้ใช้สำหรับการแสดงผลภาพ |
อัลกอริทึมการสร้างภาพแบบฮาล์ฟโทน (ออฟเซ็ต 60) สามารถเป็นได้ดังนี้:
| ค่า | อัลกอริทึมการสร้างภาพขาวดำ | ความคิดเห็น |
|---|---|---|
| 0 | ไม่มี | พบได้บ่อยที่สุด |
| 1 | การกระจายข้อผิดพลาด | พารามิเตอร์การสร้างภาพแบบฮาล์ฟโทน 1 (ออฟเซ็ต 64) คือเปอร์เซ็นต์การลดทอนข้อผิดพลาด 100 หมายถึงไม่มีการลดทอน 0 หมายถึงข้อผิดพลาดไม่ถูกกระจาย |
| 2 | PANDA: อัลกอริทึมการประมวลผลสำหรับการได้มาซึ่งเอกสารที่ไม่เข้ารหัส | พารามิเตอร์การสร้างภาพแบบฮาล์ฟโทน 1 และ 2 (ค่าออฟเซ็ต 64 และ 68 ตามลำดับ) แสดงถึงมิติ X และ Y ในหน่วยพิกเซล ตามลำดับ ของรูปแบบการสร้างภาพแบบฮาล์ฟโทนที่ใช้ |
| 3 | ซูเปอร์เซอร์เคิล | พารามิเตอร์การสร้างภาพแบบฮาล์ฟโทน 1 และ 2 (ค่าออฟเซ็ต 64 และ 68 ตามลำดับ) แสดงถึงมิติ X และ Y ในหน่วยพิกเซล ตามลำดับ ของรูปแบบการสร้างภาพแบบฮาล์ฟโทนที่ใช้ |
ตารางสี
ตารางสี (พาเลท) จะปรากฏในไฟล์ภาพ BMP โดยตรงหลังจากส่วนหัวของไฟล์ BMP ส่วนหัวของ DIB และหลังจากบิตมาสก์เสริมสามหรือสี่บิต หาก ใช้ส่วนหัว BITMAPINFOHEADERพร้อมตัวเลือก BI_BITFIELDS (12 ไบต์) หรือ BI_ALPHABITFIELDS (16 ไบต์) ดังนั้น ค่าออฟเซ็ตจึงเท่ากับขนาดของBITMAPFILEHEADERบวกกับขนาดของส่วนหัว DIB (บวกเพิ่มอีก 12-16 ไบต์สำหรับบิตมาสก์เสริมสามหรือสี่บิต) หมายเหตุ: บนWindows CE สามารถใช้ส่วน หัวBITMAPINFOHEADERร่วมกับตัวเลือก BI_ALPHABITFIELDS [ 14 ]ในสมาชิก biCompression ได้
จำนวนรายการในพาเลทมีค่าเท่ากับ 2 n (โดยที่ n คือจำนวนบิตต่อพิกเซล) หรือจำนวนที่น้อยกว่าที่ระบุไว้ในส่วนหัว (ในรูปแบบส่วนหัว OS/2 BITMAPCOREHEADERรองรับเฉพาะพาเลทขนาดเต็มเท่านั้น) [ 3 ] [ 5 ]ในกรณีส่วนใหญ่ แต่ละรายการในตารางสีจะใช้พื้นที่ 4 ไบต์ ตามลำดับ สีน้ำเงิน สีเขียว สีแดง 0x00 (ดูข้อยกเว้นด้านล่าง) โดยจะระบุเป็นดัชนีในBITMAPINFOHEADERในสมาชิกโครงสร้าง biBitCount
ตารางสีคือบล็อกของไบต์ (ตาราง) ที่แสดงรายการสีที่ใช้ในภาพ แต่ละพิกเซลในภาพสีแบบดัชนีจะถูกอธิบายด้วยจำนวนบิต (1, 2, 4 หรือ 8) ซึ่งเป็นดัชนีของสีเดียวที่อธิบายไว้ในตารางนี้ วัตถุประสงค์ของจานสีในบิตแมปสีแบบดัชนีคือการแจ้งให้แอปพลิเคชันทราบเกี่ยวกับสีจริงที่ค่าดัชนีแต่ละค่าสอดคล้องกัน วัตถุประสงค์ของตารางสีในบิตแมปแบบไม่ใช้ดัชนี (ไม่ใช้จานสี) คือการแสดงรายการสีที่ใช้โดยบิตแมปเพื่อวัตถุประสงค์ในการปรับให้เหมาะสมบนอุปกรณ์ที่มีความสามารถในการแสดงสีจำกัด และเพื่ออำนวยความสะดวกในการแปลงเป็นรูปแบบพิกเซลและจานสีต่างๆ ในอนาคต
โดยปกติสีในตารางสีจะถูกระบุใน รูปแบบ ARGB32 ขนาด 4 ไบต์ต่อรายการ ตารางสีที่ใช้กับ OS/2 BITMAPCOREHEADER ใช้ รูปแบบRGB24 ขนาด 3 ไบต์ต่อรายการ[ 3 ] [ 5 ] สำหรับ DIB ที่โหลดในหน่วยความจำ ตารางสีสามารถประกอบด้วยรายการขนาด 2 ไบต์ได้ โดยรายการเหล่านี้จะเป็นดัชนีของจานสีที่ใช้งานอยู่ในปัจจุบัน[ 7 ]แทนที่จะเป็นการกำหนดสี RGB อย่างชัดเจน
Microsoft ไม่อนุญาตให้มีบิตมาสก์ช่องอัลฟาที่ถูกต้อง[ 15 ]ในBITMAPV4HEADERและBITMAPV5HEADERสำหรับภาพสีดัชนี 1bpp, 4bpp และ 8bpp ซึ่งบ่งชี้ว่ารายการตารางสีสามารถระบุส่วนประกอบอัลฟาโดยใช้รูปแบบ8.8.8.[0-8].[0-8]ผ่านสมาชิก RGBQUAD.rgbReserved [ 16 ] ได้เช่น กัน อย่างไรก็ตาม เอกสารบางเวอร์ชันของ Microsoft ไม่อนุญาตให้ใช้คุณสมบัตินี้โดยระบุว่าสมาชิก RGBQUAD.rgbReserved "ต้องเป็นศูนย์"
ดังที่กล่าวไว้ข้างต้น โดยปกติแล้วตารางสีจะไม่ถูกใช้เมื่อพิกเซลอยู่ในรูปแบบ 16 บิตต่อพิกเซล (16bpp) (และสูงกว่า) โดยปกติจะไม่มีรายการตารางสีในไฟล์ภาพบิตแมปเหล่านั้น อย่างไรก็ตาม เอกสารของ Microsoft (บนเว็บไซต์ MSDN ณ วันที่ 16 พฤศจิกายน 2010 [ 17 ] ) ระบุว่าสำหรับ 16bpp (และสูงกว่า) ตารางสีสามารถมีอยู่เพื่อจัดเก็บรายการสีที่ตั้งใจไว้สำหรับการปรับให้เหมาะสมบนอุปกรณ์ที่มีความสามารถในการแสดงสีที่จำกัด ในขณะเดียวกันก็ระบุว่าในกรณีดังกล่าว จะไม่มีรายการพาเลทที่จัดทำดัชนีอยู่ในตารางสีนี้ สิ่งนี้อาจดูเหมือนเป็นความขัดแย้งหากไม่มีการแยกความแตกต่างระหว่างรายการพาเลทที่จำเป็นและรายการสีที่เป็นตัวเลือก
พื้นที่จัดเก็บข้อมูลพิกเซล
บิตที่แสดงถึงพิกเซลของบิตแมปจะถูกบรรจุในแถว (เรียกอีกอย่างว่า strides หรือ scan lines) ขนาดของแต่ละแถวจะถูกปัดขึ้นเป็นจำนวนเท่าของ 4 ไบต์ ( DWORD 32 บิต ) โดยการเติม[ 18 ]
สำหรับรูปภาพที่มีความสูงมากกว่า 1 จะมีการจัดเก็บแถวที่มีการเว้นช่องว่างหลายแถวต่อเนื่องกัน ทำให้เกิดเป็นอาร์เรย์พิกเซล
จำนวนไบต์ทั้งหมดที่จำเป็นในการจัดเก็บพิกเซลหนึ่งแถวสามารถคำนวณได้ดังนี้:
จำนวนไบต์ทั้งหมดที่จำเป็นในการจัดเก็บอาร์เรย์ของพิกเซลใน ภาพที่มีความละเอียด nบิตต่อพิกเซล (bpp) และมีสี 2nสีสามารถคำนวณได้โดยคำนึงถึงผลของการปัดเศษขนาดของแต่ละแถวให้เป็นจำนวนเท่าของ 4 ไบต์ ดังนี้:
อาร์เรย์พิกเซล (ข้อมูลบิตแมป)
อาร์เรย์พิกเซลเป็นบล็อกของ DWORD ขนาด 32 บิต ซึ่งอธิบายพิกเซลของภาพทีละพิกเซล โดยปกติพิกเซลจะถูกจัดเก็บแบบ "ล่างขึ้นบน" โดยเริ่มจากมุมล่างซ้าย ไล่จากซ้ายไปขวา แล้วเรียงเป็นแถวจากล่างขึ้นบนของภาพ[ 5 ]เว้นแต่ จะใช้ BITMAPCOREHEADERบิตแมปของ Windows ที่ไม่ได้บีบอัดยังสามารถจัดเก็บจากบนลงล่างได้ เมื่อค่าความสูงของภาพเป็นค่าลบ
ใน DIB OS/2 ดั้งเดิม ค่าความลึกของสีที่ถูกต้องตามกฎหมายมีเพียง 4 ค่า คือ 1, 4, 8 และ 24 บิตต่อพิกเซล (bpp) [ 5 ] ส่วนหัว DIB ในปัจจุบันอนุญาตให้ใช้รูปแบบพิกเซลที่มี 1, 2, 4, 8, 16, 24 และ 32 บิตต่อพิกเซล (bpp) [ 19 ] GDI+ยังอนุญาตให้ใช้ 64 บิตต่อพิกเซลได้อีกด้วย[ 20 ]
ต้องเพิ่มไบต์สำหรับเติม (ไม่จำเป็นต้องเป็น 0) ต่อท้ายแถวเพื่อให้ความยาวของแถวเป็นจำนวนเท่าของสี่ไบต์ เมื่อโหลดอาร์เรย์พิกเซลลงในหน่วยความจำ แต่ละแถวต้องเริ่มต้นที่ที่อยู่หน่วยความจำที่เป็นจำนวนเท่าของ 4 ข้อจำกัดที่อยู่/ออฟเซ็ตนี้เป็นข้อบังคับเฉพาะสำหรับอาร์เรย์พิกเซลที่โหลดในหน่วยความจำเท่านั้น สำหรับวัตถุประสงค์ในการจัดเก็บไฟล์ ขนาดของแต่ละแถวเท่านั้นที่ต้องเป็นจำนวนเท่าของ 4 ไบต์ ในขณะที่ออฟเซ็ตไฟล์สามารถกำหนดได้ตามอำเภอใจ[ 5 ]บิตแมป 24 บิตที่มี Width=1 จะมีข้อมูล 3 ไบต์ต่อแถว (สีน้ำเงิน สีเขียว สีแดง) และไบต์สำหรับเติม 1 ไบต์ ในขณะที่ Width=2 จะมีข้อมูล 6 ไบต์และไบต์สำหรับเติม 2 ไบต์ Width=3 จะมีข้อมูล 9 ไบต์และไบต์สำหรับเติม 3 ไบต์ และ Width=4 จะมีข้อมูล 12 ไบต์และไม่มีไบต์สำหรับเติม
การบีบอัด
- ภาพสี แบบดัชนี อาจถูกบีบอัดด้วยอัลกอริธึม RLE 4 บิต หรือ 8 บิตหรือ อัลกอริธึม Huffman 1D
- OS/2 BITMAPCOREHEADER 2 รูปภาพ 24bppอาจถูกบีบอัดด้วยอัลกอริทึม RLE 24 บิต
- ภาพขนาด 16 บิตต่อพิกเซลและ32 บิตต่อพิกเซลจะถูกจัดเก็บโดยไม่มีการบีบอัดเสมอ
- โปรดทราบว่าสามารถจัดเก็บภาพที่มีความลึกสีทุกระดับได้โดยไม่ต้องบีบอัดหากต้องการ
รูปแบบพิกเซล
- รูปแบบ 1 บิตต่อพิกเซล (1bpp) รองรับสีที่แตกต่างกัน 2 สี (ตัวอย่างเช่น สีดำและสีขาว) ค่าพิกเซลจะถูกจัดเก็บในแต่ละบิต โดยพิกเซลแรก (ซ้ายสุด) จะอยู่ในบิตที่มีค่ามากที่สุดของไบต์แรก[ 5 ]แต่ละบิตเป็นดัชนีในตารางสี 2 สี บิตที่ไม่ได้ตั้งค่าจะอ้างอิงถึงรายการสีแรกในตาราง และบิตที่ตั้งค่าจะอ้างอิงถึงรายการสีสุดท้าย (ที่สอง) ในตาราง
- รูปแบบ 2 บิตต่อพิกเซล (2bpp) รองรับสีที่แตกต่างกัน 4 สี และจัดเก็บ 4 พิกเซลต่อ 1 ไบต์ โดยพิกเซลซ้ายสุดจะอยู่ในสองบิตที่มีนัยสำคัญที่สุด ( เฉพาะWindows CE เท่านั้น: [ 21 ] ) ค่าพิกเซลแต่ละค่าเป็นดัชนี 2 บิตในตารางที่มีสีได้สูงสุด 4 สี
- รูปแบบ 4 บิตต่อพิกเซล (4bpp) รองรับสีที่แตกต่างกัน 16 สี และจัดเก็บ 2 พิกเซลต่อ 1 ไบต์ โดยพิกเซลซ้ายสุดจะอยู่ในนิบเบิลที่ สำคัญกว่า [ 5 ] ค่าพิกเซลแต่ละค่าเป็นดัชนี 4 บิตในตารางที่มีสีได้มากถึง 16 สี
- รูปแบบ 8 บิตต่อพิกเซล (8bpp) รองรับสีที่แตกต่างกันได้ 256 สี และจัดเก็บ 1 พิกเซลต่อ 1 ไบต์ โดยแต่ละไบต์เป็นดัชนีในตารางที่มีสีได้มากถึง 256 สี
- รูปแบบ 16 บิตต่อพิกเซล (16bpp) รองรับสีที่แตกต่างกันได้ 65536 สี และจัดเก็บ 1 พิกเซลต่อ WORD ขนาด 2 ไบต์ โดยแต่ละ WORD สามารถกำหนดค่า อัลฟา สีแดง สีเขียว และสีน้ำเงิน ของพิกเซลได้
- รูปแบบ 24 บิตต่อพิกเซล (24bpp) รองรับสีที่แตกต่างกัน 16,777,216 สี และจัดเก็บค่าพิกเซล 1 ค่าต่อ 3 ไบต์ แต่ละค่าพิกเซลกำหนดตัวอย่างสีแดง สีเขียว และสีน้ำเงินของพิกเซล (8.8.8.0.0 ในสัญกรณ์ RGBAX) โดยเฉพาะอย่างยิ่ง ตามลำดับ: สีน้ำเงิน สีเขียว และสีแดง (8 บิตต่อตัวอย่างแต่ละตัว) [ 5 ]
- รูปแบบ 32 บิตต่อพิกเซล (32bpp) รองรับสีที่แตกต่างกันได้ 4,294,967,296 สี และจัดเก็บ 1 พิกเซลต่อ DWORD ขนาด 4 ไบต์ โดยแต่ละ DWORD สามารถกำหนดค่าอัลฟา สีแดง สีเขียว และสีน้ำเงินของพิกเซลได้
เพื่อแก้ไขความกำกวมว่าบิตใดกำหนดค่าตัวอย่างใด ส่วนหัวของไฟล์ DIB จึงมีค่าเริ่มต้นบางอย่าง รวมถึง BITFIELDS เฉพาะ ซึ่งเป็นมาสก์บิตที่กำหนดการเป็นสมาชิกของกลุ่มบิตเฉพาะในพิกเซลให้กับช่องสัญญาณเฉพาะ แผนภาพต่อไปนี้แสดงกลไกนี้:
ฟิลด์ตัวอย่างที่กำหนดโดยบิตมาสก์ BITFIELDS จะต้องอยู่ติดกันและไม่ทับซ้อนกัน แต่ลำดับของฟิลด์ตัวอย่างนั้นเป็นไปตามอำเภอใจ ลำดับฟิลด์ที่พบได้ทั่วไปมากที่สุดคือ: Alpha, Blue, Green, Red (MSB ถึง LSB) บิตมาสก์สีแดง สีเขียว และสีน้ำเงินจะใช้งานได้ก็ต่อเมื่อสมาชิก Compression ของส่วนหัว DIB ถูกตั้งค่าเป็น BI_BITFIELDS เท่านั้น บิตมาสก์ Alpha จะใช้งานได้เมื่อใดก็ตามที่มีอยู่ในส่วนหัว DIB หรือเมื่อสมาชิก Compression ของส่วนหัว DIB ถูกตั้งค่าเป็น BI_ALPHABITFIELDS [ 14 ] ( เฉพาะ Windows CEเท่านั้น)
ชนิดย่อยของวิดีโอ RGB
กลไก BITFIELD ที่อธิบายไว้ข้างต้นอนุญาตให้กำหนดรูปแบบพิกเซลที่แตกต่างกันได้หลายหมื่นรูปแบบ อย่างไรก็ตาม ในทางปฏิบัติมีการใช้งานเพียงไม่กี่รูปแบบเท่านั้น[ 22 ]รูปแบบพาเล็ตทั้งหมด RGB8, RGB4 และ RGB1 (ทำเครื่องหมายด้วยสีเหลืองในตารางด้านบน กำหนดไว้ในdshow.hชื่อ .MEDIASUBTYPE):
| อาร์บีเอ็กซ์ | ชนิดย่อย RGB | อาร์บีเอ็กซ์ | ชนิดย่อย ARGB |
|---|---|---|---|
| 8.8.8.0.8 | อาร์จีบี32 | 8.8.8.8.0 | ARGB32 |
| 10.10.10.2.0 | เอ2อาร์10จี10บี10 | ||
| 8.8.8.0.0 | อาร์จีบี24 | 10.10.10.2.0 | เอ2บี10จี10อาร์10 |
| 5.6.5.0.0 | อาร์จีบี565 | 4.4.4.4.0 | ARGB4444 |
| 5.5.5.0.1 | อาร์จีบี555 | 5.5.5.1.0 | ARGB1555 |
| บิตฟิลด์ | ออฟเซ็ต (เลขฐานสิบหก) | บิตเอ2อาร์10จี10บี10 | บิตเอ2บี10จี10อาร์10 | ||||
|---|---|---|---|---|---|---|---|
| สีแดง | 36 | 00 00 F0 3F | LE:3FF00000 | 20...29 | FF 03 00 00 | LE:000003FF | 0... 9 |
| สีเขียว | 3A | 00 FC 0F 00 | LE:000FFC00 | 10...19 | 00 FC 0F 00 | LE:000FFC00 | 10...19 |
| สีฟ้า | 3E | FF 03 00 00 | LE:000003FF | 0... 9 | 00 00 F0 3F | LE:3FF00000 | 20...29 |
| อัลฟ่า | 42 | 00 00 00 C0 | LE:C0000000 | 30...31 | 00 00 00 C0 | LE:C0000000 | 30...31 |
ในเวอร์ชัน 2.1.4 FFmpegรองรับ (ตามคำศัพท์ของตัวเอง) รูปแบบพิกเซล BMP ได้แก่bgra, bgr24, rgb565le, rgb555le, rgb444le, rgb8, bgr8, rgb4_byte, bgr4_byte, gray, pal8และmonobกล่าวคือbgraเป็นรูปแบบพิกเซลเดียวที่รองรับความโปร่งใส[ 24 ]

ตัวอย่างที่ 1
ต่อไปนี้เป็นตัวอย่างของภาพบิตแมปขนาด 2x2 พิกเซล ความละเอียด 24 บิต (ส่วนหัวของไฟล์ DIB ใน Windows คือBITMAPINFOHEADER ) โดยมีรูปแบบพิกเซลเป็น RGB24
| ออฟเซ็ต (เลขฐานสิบหก) | ขนาด (ไบต์) | ค่าเลขฐานสิบหก | ค่า | คำอธิบาย |
|---|---|---|---|---|
| ส่วนหัว BMP | ||||
| 00 | 2 | 42 4D | "บีเอ็ม" | ช่อง ID ( 42 4D) |
| 02 | 4 | 46 00 00 00 | 70 ไบต์ (54+16) | ขนาดของไฟล์ BMP (ส่วนหัว 54 ไบต์ + ข้อมูล 16 ไบต์) |
| 06 | 2 | 00 00 | ยังไม่ได้ใช้งาน | เฉพาะแอปพลิเคชัน |
| 08 | 2 | 00 00 | ยังไม่ได้ใช้งาน | เฉพาะแอปพลิเคชัน |
| 0A | 4 | 36 00 00 00 | 54 ไบต์ (14+40) | ตำแหน่งที่สามารถพบอาร์เรย์พิกเซล (ข้อมูลบิตแมป) ได้ |
| ส่วนหัว DIB | ||||
| 0E | 4 | 28 00 00 00 | 40 ไบต์ | จำนวนไบต์ในส่วนหัวของไฟล์ DIB (นับจากจุดนี้) |
| 12 | 4 | 02 00 00 00 | 2 พิกเซล (เรียงจากซ้ายไปขวา) | ความกว้างของภาพบิตแมปในหน่วยพิกเซล |
| 16 | 4 | 02 00 00 00 | 2 พิกเซล (เรียงจากล่างขึ้นบน) | ความสูงของภาพบิตแมปในหน่วยพิกเซล ค่าบวกแสดงถึงลำดับพิกเซลจากล่างขึ้นบน |
| 1A | 2 | 01 00 | เครื่องบิน 1 ลำ | จำนวนระนาบสีที่ใช้ |
| 1ซี | 2 | 18:00 น. | 24 บิต | จำนวนบิตต่อพิกเซล |
| 1E | 4 | 00 00 00 00 | 0 | BI_RGB, ไม่มีการบีบอัดอาร์เรย์พิกเซล |
| 22 | 4 | 10 00 00 00 | 16 ไบต์ | ขนาดของข้อมูลบิตแมปดิบ (รวมถึงขอบ) |
| 26 | 4 | 13 0B 00 00 | 2835 พิกเซล/เมตร ในแนวนอน | ความละเอียดในการพิมพ์ภาพ72 DPI × 39.3701 นิ้วต่อเมตร จะได้ขนาด 2834.6472 |
| 2A | 4 | 13 0B 00 00 | 2835 พิกเซล/เมตร แนวตั้ง | |
| 2E | 4 | 00 00 00 00 | 0 สี | จำนวนสีในจานสี |
| 32 | 4 | 00 00 00 00 | 0 สีสำคัญ | 0 หมายความว่าทุกสีมีความสำคัญ |
| จุดเริ่มต้นของอาร์เรย์พิกเซล (ข้อมูลบิตแมป) | ||||
| 36 | 3 | 00 00 FF | 0 0 255 | สีแดง, พิกเซล (x=0, y=1) |
| 39 | 3 | FF FF FF | 255 255 255 | สีขาว, พิกเซล (x=1, y=1) |
| 3ซี | 2 | 00 00 | 0 0 | ค่าเผื่อสำหรับการจัดเรียงข้อมูล 4 ไบต์ (อาจเป็นค่าอื่นที่ไม่ใช่ศูนย์) |
| 3E | 3 | FF 00 00 | 255 0 0 | สีน้ำเงิน, พิกเซล (x=0, y=0) |
| 41 | 3 | 00 FF 00 | 0 255 0 | สีเขียว, พิกเซล (x=1, y=0) |
| 44 | 2 | 00 00 | 0 0 | ค่าเผื่อสำหรับการจัดเรียงข้อมูล 4 ไบต์ (อาจเป็นค่าอื่นที่ไม่ใช่ศูนย์) |

ตัวอย่างที่ 2
ต่อไปนี้เป็นตัวอย่างของภาพบิตแมปขนาด 4x2 พิกเซล ความละเอียด 32 บิต โดยมีค่าความทึบแสงอยู่ในช่องอัลฟา (ส่วนหัวของไฟล์ DIB ใน Windows คือBITMAPV4HEADER ) และรูปแบบพิกเซลเป็น ARGB32
| ออฟเซ็ต (เลขฐานสิบหก) | ขนาด (ไบต์) | ค่าเลขฐานสิบหก | ค่า | คำอธิบาย |
|---|---|---|---|---|
| ส่วนหัว BMP | ||||
| 00 | 2 | 42 4D | "บีเอ็ม" | ช่องรหัสประจำตัว (42h, 4Dh) |
| 02 | 4 | 9A 00 00 00 | 154 ไบต์ (122+32) | ขนาดของไฟล์ BMP |
| 06 | 2 | 00 00 | ยังไม่ได้ใช้งาน | เฉพาะแอปพลิเคชัน |
| 08 | 2 | 00 00 | ยังไม่ได้ใช้งาน | เฉพาะแอปพลิเคชัน |
| 0A | 4 | 7A 00 00 00 | 122 ไบต์ (14+108) | ตำแหน่งที่สามารถพบอาร์เรย์พิกเซล (ข้อมูลบิตแมป) ได้ |
| ส่วนหัว DIB | ||||
| 0E | 4 | 6C 00 00 00 | 108 ไบต์ | จำนวนไบต์ในส่วนหัวของไฟล์ DIB (นับจากจุดนี้) |
| 12 | 4 | 04 00 00 00 | 4 พิกเซล (เรียงจากซ้ายไปขวา) | ความกว้างของภาพบิตแมปในหน่วยพิกเซล |
| 16 | 4 | 02 00 00 00 | 2 พิกเซล (เรียงจากล่างขึ้นบน) | ความสูงของภาพบิตแมปในหน่วยพิกเซล |
| 1A | 2 | 01 00 | เครื่องบิน 1 ลำ | จำนวนระนาบสีที่ใช้ |
| 1ซี | 2 | 20 00 | 32 บิต | จำนวนบิตต่อพิกเซล |
| 1E | 4 | 03 00 00 00 | 3 | BI_BITFIELDS ไม่มีการบีบอัดอาร์เรย์พิกเซล |
| 22 | 4 | 20 00 00 00 | 32 ไบต์ | ขนาดของข้อมูลบิตแมปดิบ (รวมถึงขอบ) |
| 26 | 4 | 13 0B 00 00 | 2835 พิกเซล/เมตร ในแนวนอน | ความละเอียดในการพิมพ์ภาพ 72 DPI × 39.3701 นิ้วต่อเมตร จะได้ขนาด 2834.6472 |
| 2A | 4 | 13 0B 00 00 | 2835 พิกเซล/เมตร แนวตั้ง | |
| 2E | 4 | 00 00 00 00 | 0 สี | จำนวนสีในจานสี |
| 32 | 4 | 00 00 00 00 | 0 สีสำคัญ | 0 หมายความว่าทุกสีมีความสำคัญ |
| 36 | 4 | 00 00 FF 00 | 00FF0000 ในรูปแบบ big-endian | บิตมาสก์ช่องสีแดง (ใช้ได้เนื่องจากมีการระบุ BI_BITFIELDS) |
| 3A | 4 | 00 FF 00 00 | 0000FF00 ในรูปแบบ big-endian | บิตมาสก์ช่องสีเขียว (ใช้ได้เนื่องจากมีการระบุ BI_BITFIELDS) |
| 3E | 4 | FF 00 00 00 | 000000FF ในรูปแบบ big-endian | บิตมาสก์ช่องสีน้ำเงิน (ใช้ได้เนื่องจากมีการระบุ BI_BITFIELDS) |
| 42 | 4 | 00 00 00 FF | FF000000 ในรูปแบบ big-endian | บิตมาสก์ช่องอัลฟา |
| 46 | 4 | 20 6E 69 57 | ลิตเติ้ลเอนเดียน " Win " | LCS_WINDOWS_COLOR_SPACE |
| 4A | 36 | 00...00 | จุดสิ้นสุดของพื้นที่สี CIEXYZTRIPLE | ไม่ได้ใช้สำหรับ LCS " Win " หรือ " sRGB" |
| 6E | 4 | 00 00 00 00 | 0 เรดแกมมา | ไม่ได้ใช้สำหรับ LCS " Win " หรือ " sRGB" |
| 72 | 4 | 00 00 00 00 | 0 กรีนแกมมา | ไม่ได้ใช้สำหรับ LCS " Win " หรือ " sRGB" |
| 76 | 4 | 00 00 00 00 | 0 บลูแกมมา | ไม่ได้ใช้สำหรับ LCS " Win " หรือ " sRGB" |
| จุดเริ่มต้นของอาร์เรย์พิกเซล (ข้อมูลบิตแมป) | ||||
| 7A | 4 | FF 00 00 7F | 255 0 0 127 | สีน้ำเงิน (ค่าอัลฟา: 127), พิกเซล (x=0, y=1) |
| 7E | 4 | 00 FF 00 7F | 0 255 0 127 | สีเขียว (อัลฟา: 127), พิกเซล (x=1, y=1) |
| 82 | 4 | 00 00 FF 7F | 0 0 255 127 | สีแดง (ค่าอัลฟา: 127), พิกเซล (x=2, y=1) |
| 86 | 4 | FF FF FF 7F | 255 255 255 127 | สีขาว (ค่าอัลฟา: 127), พิกเซล (x=3, y=1) |
| 8A | 4 | FF 00 00 FF | 255 0 0 255 | สีน้ำเงิน (ค่าอัลฟา: 255), พิกเซล (x=0, y=0) |
| 8E | 4 | 00 FF 00 FF | 0 255 0 255 | สีเขียว (ค่าอัลฟา: 255), พิกเซล (x=1, y=0) |
| 92 | 4 | 00 00 FF FF | 0 0 255 255 | สีแดง (ค่าอัลฟา: 255), พิกเซล (x=2, y=0) |
| 96 | 4 | FF FF FF FF | 255 255 255 255 | สีขาว (ค่าอัลฟา: 255), พิกเซล (x=3, y=0) |
โปรดสังเกตว่าข้อมูลบิตแมปเริ่มต้นจากมุมล่างซ้ายของภาพ
การใช้งานรูปแบบ BMP
ความเรียบง่ายของรูปแบบไฟล์ BMP และความคุ้นเคยอย่างแพร่หลายใน Windows และระบบปฏิบัติการอื่นๆ รวมถึงข้อเท็จจริงที่ว่ารูปแบบนี้มีเอกสารประกอบค่อนข้างดีและเป็นรูปแบบเปิดทำให้ BMP เป็นรูปแบบที่ใช้กันทั่วไปซึ่งโปรแกรมประมวลผลภาพจากระบบปฏิบัติการหลายระบบสามารถอ่านและเขียนได้ ไฟล์ ICOและ CUR ประกอบด้วยบิตแมปที่ขึ้นต้นด้วยส่วนหัว BITMAPINFOHEADER
อินเทอร์เฟซผู้ใช้แบบกราฟิกรุ่นเก่าจำนวนมากใช้บิตแมปในระบบย่อยกราฟิกในตัว[ 25 ]ตัวอย่างเช่น ระบบย่อย GDI ของแพลตฟอร์ม Microsoft Windows และ OS/2 ซึ่งรูปแบบเฉพาะที่ใช้คือรูปแบบไฟล์บิตแมปของ Windows และ OS/2ซึ่งมักตั้งชื่อโดยใช้ส่วนขยายไฟล์.BMP . [ 26 ]
แม้ว่าไฟล์ BMP ส่วนใหญ่จะมีขนาดไฟล์ค่อนข้างใหญ่เนื่องจากไม่มีการบีบอัด (หรือโดยทั่วไปแล้วใช้การเข้ารหัสแบบ Run-Length Encoding อัตราส่วนต่ำ บนภาพแบบ Palletized) แต่ไฟล์ BMP จำนวนมากสามารถบีบอัดได้อย่างมากด้วย อัลกอริธึม การบีบอัดข้อมูลแบบไม่สูญเสียเช่นZIPเนื่องจากมีข้อมูลที่ซ้ำซ้อนอยู่ บางรูปแบบ เช่นRARยังมีฟังก์ชันที่ออกแบบมาเพื่อการบีบอัดข้อมูลดังกล่าวอย่างมีประสิทธิภาพโดยเฉพาะอีกด้วย
รูปแบบที่เกี่ยวข้อง
ระบบX Window Systemใช้ รูปแบบ XBM ที่คล้ายกัน สำหรับภาพขาวดำ และXPM ( pixelmap ) สำหรับภาพสี นอกจากนี้ยังมีรูปแบบ "raw" หลากหลายรูปแบบ ซึ่งบันทึกข้อมูลดิบโดยไม่มีข้อมูลอื่นใด รูปแบบ Portable Pixmap (PPM) และTruevision TGAก็มีอยู่เช่นกัน แต่ไม่ค่อยได้ใช้ หรือใช้เฉพาะในกรณีพิเศษเท่านั้น ตัวอย่างเช่น TGA สามารถบรรจุข้อมูลความโปร่งใสได้
ลิงก์ภายนอก
- โครงสร้างไฟล์ภาพบิตแมปที่ digicamsoft.com
- ข้อมูลเบื้องต้นเกี่ยวกับ DIBs (Device Independent Bitmaps)ที่ herdsoft.com
- คลาส C++ สำหรับโหลดภาพบิตแมปอย่างง่ายที่ kalytta.com (ยังไม่รองรับ A2R10G10B10)
- รูปแบบไฟล์ BMP ตอนที่ 1 โดย เดวิด ชาร์แลปในวารสารเครื่องมือซอฟต์แวร์ของดร. ด็อบบ์ (drdobbs.com) มีนาคม 1995
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ รูปแบบไฟล์ BMP
รูป แบบไฟล์ BMP หรือ บิตแมป เป็น รูปแบบไฟล์ ภาพกราฟิกแรสเตอร์ ที่ใช้ในการจัดเก็บ ภาพดิจิทัล บิตแมป โดยไม่ขึ้นอยู่กับ อุปกรณ์แสดงผล (เช่น อะ แดปเตอร์กราฟิก )...
บิตแมปที่ไม่ขึ้นกับอุปกรณ์และรูปแบบไฟล์ BMP
ไมโครซอฟต์ได้กำหนดรูปแบบการแสดงภาพบิตแมปสีที่มีความลึกของสีแตกต่างกันโดยเฉพาะ เพื่อช่วยในการแลกเปลี่ยนภาพบิตแมประหว่างอุปกรณ์และแอปพลิเคชันที่มีรูปแบบการแสดงผลภายในที่หลากหลาย พวกเขาเรียกภาพบิตแมปเหล่านี้ว่า ภาพบิตแมปที่ไม่ขึ้นกับอุปกรณ์ หรือ DIB...
โครงสร้างไฟล์
ไฟล์ภาพบิตแมปประกอบด้วยโครงสร้างขนาดคงที่ (ส่วนหัว) และโครงสร้างขนาดแปรผันที่ปรากฏตามลำดับที่กำหนดไว้ล่วงหน้า เนื่องจากรูปแบบไฟล์นี้มีการพัฒนามาอย่างยาวนาน จึงอาจมีโครงสร้างบางส่วนที่แตกต่างกันหลายเวอร์ชันปรากฏอยู่ในไฟล์เดียวกัน
DIB ในหน่วยความจำ
ไฟล์ภาพบิตแมปที่โหลดลงในหน่วยความจำจะกลายเป็นโครงสร้างข้อมูล DIB ซึ่งเป็นส่วนประกอบสำคัญของ Windows GDI API โครงสร้างข้อมูล DIB ในหน่วยความจำนั้นเกือบจะเหมือนกับรูปแบบไฟล์ BMP แต่ไม่มีส่วนหัวไฟล์บิตแมปขนาด 14 ไบต์ และเริ่มต้นด้วยส่วนหัว DIB สำหรับ DIB...