ไฟล์ BMP คืออะไร??
ไฟล์ที่มีนามสกุล .BMP แสดงถึงไฟล์รูปภาพบิตแมปที่ใช้ในการเก็บภาพดิจิทัลบิตแมป รูปภาพเหล่านี้ไม่ขึ้นกับอะแดปเตอร์กราฟิกและเรียกอีกอย่างว่ารูปแบบไฟล์บิตแมป (DIB) ที่ไม่ขึ้นกับอุปกรณ์ ความเป็นอิสระนี้มีจุดประสงค์ในการเปิดไฟล์บนหลายแพลตฟอร์ม เช่น Microsoft Windows และ Mac รูปแบบไฟล์ BMP สามารถจัดเก็บข้อมูลเป็นภาพดิจิตอลสองมิติทั้งในรูปแบบขาวดำและรูปแบบสีที่มีความลึกของสีต่างๆ
ข้อมูลจำเพาะรูปแบบไฟล์ BMP
บิตแมปที่ไม่ขึ้นกับอุปกรณ์ทำหน้าที่เป็นตัวช่วยในการแลกเปลี่ยนบิตแมประหว่างอุปกรณ์และแอปพลิเคชัน เนื่องจากการพัฒนาอย่างต่อเนื่องของรูปแบบไฟล์นี้ ข้อมูลที่อยู่ในส่วนหัวอาจแตกต่างกันไปตามเวอร์ชันของบิตแมป ไฟล์บิตแมปเดียวประกอบด้วยโครงสร้างขนาดคงที่และขนาดตัวแปรในลำดับเฉพาะ
โครงสร้างในไฟล์ Bitmap จัดเรียงตามลำดับต่อไปนี้:
โครงสร้าง | ทางเลือก | ขนาด | วัตถุประสงค์ |
---|---|---|---|
ส่วนหัวของไฟล์ | ไม่ | 14 | เพื่อเก็บข้อมูลทั่วไปเกี่ยวกับไฟล์ภาพบิตแมป |
DIB Header | No | Fixed-Size | เพื่อเก็บข้อมูลโดยละเอียดเกี่ยวกับภาพบิตแมปและกำหนดรูปแบบพิกเซล |
มาสก์บิตพิเศษ | ใช่ | 12 หรือ 16 ไบต์ | เพื่อกำหนดรูปแบบพิกเซล |
จานสี | กึ่งทางเลือก | ขนาดตัวแปร | เพื่อกำหนดสีที่ใช้โดยข้อมูลภาพบิตแมป |
Gap1 | ใช่ | ขนาดตัวแปร | การจัดตำแหน่งโครงสร้าง |
Pixel Array | No | Variable-size | Pixel format กำหนดโดย DIB header หรือ Extra bit masks |
Gap2 | ใช่ | ขนาดตัวแปร | การจัดตำแหน่งโครงสร้าง |
โปรไฟล์สี ICC | ใช่ | ขนาดตัวแปร | เพื่อกำหนดโปรไฟล์สีสำหรับการจัดการสี |
เมื่ออิมเมจบิตแมปถูกโหลดลงในหน่วยความจำ ภาพนั้นจะกลายเป็นโครงสร้าง DIB ซึ่งใช้โดย Windows ผ่าน GDI API ส่วนหัวของไฟล์ไม่ได้เป็นส่วนหนึ่งของโครงสร้างข้อมูลนี้ สียังสามารถประกอบด้วยรายการ 16 บิตที่เป็นดัชนีของจานสีที่อ้างอิงในปัจจุบัน แทนที่จะเป็นคำจำกัดความสี RGB ที่ชัดเจน มาดูรายละเอียดบางส่วนเหล่านี้โดยเฉพาะส่วนหัว
ส่วนหัวของไฟล์บิตแมป
ส่วนหัวของไฟล์บิตแมปคล้ายกับส่วนหัวของไฟล์อื่นๆ ที่ใช้ในการระบุไฟล์ เนื่องจากมีรูปแบบไฟล์ BMP ที่แตกต่างกัน 2 ไบต์แรกของรูปแบบไฟล์ BMP คืออักขระ “B” และอักขระ “M” ในการเข้ารหัส ASCII ค่าจำนวนเต็มทั้งหมดจะถูกจัดเก็บในรูปแบบ little-endian
ออฟเซ็ต hex | ออฟเซ็ต ธันวาคม | ขนาด | วัตถุประสงค์ |
---|---|---|---|
00 | 0 | 2 ไบต์ | ฟิลด์ส่วนหัวที่ใช้ในการระบุไฟล์ BMP และ DIB คือ 0x42 0x4D ในเลขฐานสิบหก เช่นเดียวกับ BM ใน ASCII สามารถตามค่าที่เป็นไปได้* BM – Windows 3.1x, 95, NT, … etc. * BA – OS/2 struct bitmap array * CI – OS/2 struct ไอคอนสี * CP – ตัวชี้สี OS/2 const * IC – ไอคอนโครงสร้าง OS/2 * PT – ตัวชี้ OS/2 |
02 | 2 | 4 ไบต์ | ขนาดของไฟล์ BMP เป็นไบต์ |
06 | 6 | 2 ไบต์ | สงวน; ค่าจริงขึ้นอยู่กับแอปพลิเคชันที่สร้างภาพ |
08 | 8 | 2 ไบต์ | สงวน; ค่าจริงขึ้นอยู่กับแอปพลิเคชันที่สร้างภาพ |
0A | 10 | 4 ไบต์ | ออฟเซ็ต เช่น ที่อยู่เริ่มต้นของไบต์ที่สามารถพบข้อมูลภาพบิตแมป (อาร์เรย์พิกเซล) |
ส่วนหัว DIB (ส่วนหัวข้อมูลบิตแมป)
ข้อมูลโดยละเอียดเกี่ยวกับรูปภาพจะแสดงด้วยส่วนหัวนี้ จากข้อมูลนี้ แอปพลิเคชันจะถูกกำหนดว่าจะใช้เพื่อแสดงภาพบนหน้าจอ ส่วนหัวดังกล่าวทั้งหมดมีฟิลด์ DWORD (32 บิต) ซึ่งระบุขนาด เพื่อให้แอปพลิเคชันสามารถระบุส่วนหัวที่ใช้ในรูปภาพได้อย่างง่ายดาย นี่เป็นเพราะความจริงที่ว่ารูปแบบ DIB ได้รับส่วนขยายหลายรายการ ต่อไปนี้คือส่วนหัวของ DIB พร้อมฟิลด์ที่อยู่ในรายการ
จานสี
จานสี BMP เป็นอาร์เรย์ของโครงสร้างที่ระบุค่าความเข้ม RGB ของแต่ละสีในจานสีของอุปกรณ์แสดงผล แต่ละพิกเซลในข้อมูลบิตแมปจะเก็บค่าเดียวที่ใช้เป็นดัชนีในจานสี ข้อมูลสีที่จัดเก็บไว้ในองค์ประกอบที่ดัชนีนั้นระบุสีของพิกเซลนั้น ความพร้อมใช้งานของสีในไฟล์บิตแมปแตกต่างกันไปดังนี้:
- หนึ่ง 4 และ 8 บิต - คาดว่าจะประกอบด้วยจานสีเสมอ
- สิบหก 24 และ 32 บิต - ไม่มีจานสี
- ไฟล์ BMP สิบหกและ 32 บิต - มีค่ามาสก์บิตฟิลด์แทนที่จานสี
การจัดเก็บพิกเซล
บิตแมปพิกเซลจะถูกจัดเก็บเป็นบิตที่บรรจุในแถว โดยขนาดของแต่ละแถวจะถูกปัดเศษขึ้นเป็นทวีคูณของ 4 ไบต์ (DWORD แบบ 32 บิต) โดยการเติม ไม่สามารถคำนวณจำนวนไบต์ทั้งหมดที่ต้องใช้ในการจัดเก็บพิกเซลของรูปภาพได้โดยตรงโดยการนับจำนวนบิต เนื่องจากมีช่องว่างภายในเข้ามาเกี่ยวข้อง จึงจำเป็นต้องปัดเศษขึ้นขนาดของแต่ละแถวเป็นทวีคูณของ 4 ไบต์ ไบต์ที่เติม (ไม่จำเป็นต้องเป็น 0) จะต้องต่อท้ายแถวเพื่อให้ความยาวของแถวเพิ่มเป็นทวีคูณของสี่ไบต์ เมื่อโหลดอาร์เรย์พิกเซลลงในหน่วยความจำ แต่ละแถวต้องเริ่มต้นที่แอดเดรสหน่วยความจำที่มีผลคูณของ 4
รูปภาพได้รับการอธิบายโดยการแสดง DWORDs แบบ 32 บิตของอาร์เรย์พิกเซล โดยปกติแล้วพิกเซลจะถูกจัดเก็บ “จากล่างขึ้นบน” โดยเริ่มจากมุมซ้ายล่าง จากซ้ายไปขวา จากนั้นจึงเรียงแถวจากล่างขึ้นบนของภาพ รูปแบบพิกเซลและความหมายของพวกมันมีดังต่อไปนี้:
- รูปแบบ 1 บิตต่อพิกเซล (1bpp) รองรับ 2 สีที่แตกต่างกัน (เช่น: ขาวดำ)
- รูปแบบ 2 บิตต่อพิกเซล (2bpp) รองรับ 4 สีที่แตกต่างกัน และจัดเก็บ 4 พิกเซลต่อ 1 ไบต์ พิกเซลซ้ายสุดอยู่ในสองบิตที่สำคัญที่สุด ค่าพิกเซลแต่ละค่าเป็นดัชนี 2 บิตในตารางที่มีสีสูงสุด 4 สี
- รูปแบบ 4 บิตต่อพิกเซล (4bpp) รองรับสีที่แตกต่างกัน 16 สี และจัดเก็บ 2 พิกเซลต่อ 1 ไบต์ พิกเซลซ้ายสุดจะอยู่ในแทะที่มีนัยสำคัญมากกว่า ค่าพิกเซลแต่ละค่าเป็นดัชนี 4 บิตในตารางที่มีสีสูงสุด 16 สี
- รูปแบบ 8 บิตต่อพิกเซล (8bpp) รองรับสีที่แตกต่างกัน 256 สี และจัดเก็บ 1 พิกเซลต่อ 1 ไบต์ แต่ละไบต์เป็นดัชนีในตารางที่มีสีมากถึง 256 สี
- รูปแบบ 16 บิตต่อพิกเซล (16bpp) รองรับสีที่แตกต่างกัน 65536 สี และจัดเก็บ 1 พิกเซลต่อ 2 ไบต์ WORD แต่ละคำสามารถกำหนดตัวอย่างอัลฟา แดง เขียว และน้ำเงินของพิกเซล
- รูปแบบพิกเซล 24 บิต (24bpp) รองรับสีที่แตกต่างกัน 16,777,216 สี และเก็บค่า 1 พิกเซลต่อ 3 ไบต์ ค่าพิกเซลแต่ละค่ากำหนดตัวอย่างสีแดง สีเขียว และสีน้ำเงินของพิกเซล (8.8.8.0.0 ในรูปแบบ RGBAX) โดยเฉพาะอย่างยิ่ง ตามลำดับ: สีน้ำเงิน สีเขียว และสีแดง (8 บิตต่อตัวอย่างแต่ละตัวอย่าง)
- รูปแบบ 32 บิตต่อพิกเซล (32bpp) รองรับสีที่แตกต่างกัน 4,294,967,296 สี และจัดเก็บ 1 พิกเซลต่อ DWORD 4 ไบต์ DWORD แต่ละรายการสามารถกำหนดตัวอย่างอัลฟา สีแดง สีเขียว และสีน้ำเงินของพิกเซลได้