รูปแบบข้อมูล BMP (บิตแมป) เปิดไฟล์ .BMP ได้อย่างไร วิธีเปิดไฟล์ bmp บน windows 7

บทความนี้เกี่ยวกับลักษณะของรูปแบบกราฟิก bmp แม้ว่านี่จะเป็นรูปแบบที่ง่ายกว่ารูปแบบหนึ่ง แต่เนื่องจากรูปแบบนี้มีหลายรูปแบบ จึงอาจไม่ชัดเจนทุกจุด เอาล่ะหยุดเทน้ำมาเริ่มกันเลย

จัดรูปแบบโครงสร้าง

รูปแบบ bmp (จากคำว่า BitMaP - bit map หรือในภาษารัสเซียคือ bit array) เป็นรูปภาพที่ไม่มีการบีบอัด (ส่วนใหญ่) ซึ่งง่ายต่อการอ่านและแสดงใน Windows OS ซึ่งมีฟังก์ชัน API พิเศษที่ช่วยได้

ขั้นแรก เรามาแสดงข้อมูลในรูปแบบกราฟิกในรูปแบบ bmp (ภาพที่ถ่ายจาก MSDN)

ในตอนต้นจะมีส่วนหัวของไฟล์ (BITMAPFILEHEADER) มีคำอธิบายดังนี้:

bfประเภทกำหนดประเภทไฟล์ ที่นี่เขาควรจะเป็น BM หากคุณเปิดไฟล์ BMP ใดๆ ในโปรแกรมแก้ไขข้อความ (หรือดีกว่านั้นคือโปรแกรมแก้ไขเลขฐานสิบหก) คุณจะเห็นว่าอักขระสองตัวแรกคือ BM (มาจากคำว่า BitMap ดังที่คุณอาจเดาได้อยู่แล้ว)
bfSizeคือขนาดของไฟล์ในหน่วยไบต์ พูดอย่างเคร่งครัดคุณควรคำนวณ (ซึ่งแนะนำ) แต่ฉันตั้งค่าขนาดไฟล์ไม่ถูกต้อง (แม้ว่าจะไม่ได้ตั้งใจ :)) และไม่มีปัญหา (ACDSee อ่านได้โดยไม่มีปัญหาโปรแกรมของฉันใช้งานได้) แต่ฉันไม่แนะนำให้คุณ จงใจเขียนผิด ทันใดนั้นโปรแกรมที่มีมโนธรรมจะปรากฏขึ้นซึ่งจะเปรียบเทียบขนาดนี้กับของจริงและตัดสินใจว่าไม่ใช่ bmp แต่เป็นอย่างอื่น ตามหลักการแล้ว โปรแกรมทั้งหมดเพื่อให้แน่ใจว่าเป็น bmp จริงและไม่ใช่ของปลอม อันดับแรกควรตรวจสอบว่า bfType มี "BM" (โดยไม่ใส่เครื่องหมายคำพูด) และประการที่สอง bfSize นั้นเท่ากับขนาดไฟล์
bfReserved1 และ bfReserved2ถูกสงวนไว้และต้องเป็นศูนย์
bfOffBits- นี่เป็นหนึ่งในฟิลด์ที่สำคัญที่สุดในโครงสร้างนี้ โดยจะแสดงตำแหน่งที่บิตแมปเริ่มต้นโดยสัมพันธ์กับจุดเริ่มต้นของไฟล์ (หรือตามที่ MSDN กล่าวว่า "จากจุดเริ่มต้นของโครงสร้าง BITMAPFILEHEADER") ซึ่งอธิบายรูปภาพ นั่นคือเพื่อรับประกันว่าจะไปถึงจุดเริ่มต้นของอาร์เรย์คุณต้องเขียน:

typedef โครงสร้างแท็กBITMAPINFOHEADER
{
DWORD สองขนาด;
ยาวสองความกว้าง;
ยาวสองความสูง;
เครื่องบินปีกสองชั้นของ WORD;
WORD biBitCount;
DWORD การบีบอัดสองส่วน;
DWORD biSizeImage;
ยาว biXPelsPerMeter;
ยาว BiYPelsPerMeter;
DWORD biClr ใช้แล้ว;
DWORD biClrสำคัญ;
) BITMAPINFOHEADER, * PBITMAPINFOHEADER;

สองขนาดคือขนาดของโครงสร้างนั่นเอง จำเป็นต้องเริ่มต้นดังนี้: bih.biSize = sizeof(BITMAPINFOHEADER);
ที่นี่อีกครั้งเราจะถือว่า bih มีการประกาศดังต่อไปนี้: BITMAPINFOHEADER bih;
สองความกว้างและสองความสูงกำหนดความกว้างและความสูงของภาพเป็นพิกเซลตามลำดับ
เครื่องบินสองลำระบุจำนวนเครื่องบิน ตอนนี้จะตั้งไว้ที่ 1 เสมอ
biBitCount- จำนวนบิตต่อพิกเซล เราจะพูดถึงเรื่องนี้เพิ่มเติมด้านล่าง
สองการบีบอัดระบุประเภทของการบีบอัด อย่าแปลกใจหรือกลัวที่ bmp ประสบกับการบีบอัดอย่างกะทันหัน โดยส่วนตัวแล้วฉันไม่เห็น bmp ที่ถูกบีบอัดใด ๆ (แต่ฉันไม่ได้บอกว่าไม่มีอยู่จริง) หากไม่มีการบีบอัด แฟล็กนี้จะต้องตั้งค่าเป็น BI_RGB ในบทความนี้ เรากำลังพูดถึงรูปแบบที่ไม่มีการบีบอัด ดังนั้นฉันจะไม่แสดงรายการแฟล็กอื่นๆ ด้วยซ้ำ ดูเหมือนว่ามีการใช้โครงสร้างเดียวกันในไฟล์ JPEG และ PNG เนื่องจากเริ่มจาก Windows 98 มีตัวเลือก BI_JPEG ซึ่งแสดงว่ารูปภาพนี้คือ JPEG และ BI_PNG นั่นคือ PNG (ฉันไม่รู้อะไรเกี่ยวกับรูปแบบ Jpeg ฉันเพิ่งทำข้อสรุปเหล่านี้ตามสิ่งที่เขียนใน MSDN)
biSizeImageระบุขนาดของภาพเป็นไบต์ หากรูปภาพไม่มีการบีบอัด (นั่นคือ ฟิลด์ก่อนหน้าถูกตั้งค่าเป็น BI_RGB) ก็ควรเขียนเลขศูนย์ไว้ที่นี่ biXPelsPerMeterและ biYPelsPerMeterแสดงถึงความละเอียดแนวนอนและแนวตั้ง (เป็นพิกเซลต่อเมตร) ของอุปกรณ์สุดท้ายที่จะส่งออกบิตแมป (แรสเตอร์) ตามลำดับ แอปพลิเคชันสามารถใช้ค่านี้เพื่อเลือกบิตแมปที่เหมาะสมที่สุดสำหรับอุปกรณ์ที่ต้องการจากกลุ่มทรัพยากร ความจริงก็คือรูปแบบ bmp โดยพื้นฐานแล้วเป็นแรสเตอร์ที่ไม่ขึ้นกับฮาร์ดแวร์นั่นคือเมื่อรูปลักษณ์ของสิ่งที่ได้รับไม่ได้ขึ้นอยู่กับสิ่งที่แรสเตอร์นี้ฉายลงบน (เพื่อที่จะพูด) ตัวอย่างเช่น รูปภาพจะมีลักษณะเหมือนกันไม่ว่าจะวาดบนหน้าจอมอนิเตอร์หรือพิมพ์บนเครื่องพิมพ์ก็ตาม แต่ความละเอียดของอุปกรณ์นั้นแตกต่างกันและเพื่อเลือกภาพที่เหมาะสมที่สุดจากค่าที่มีอยู่ซึ่งใช้พารามิเตอร์เหล่านี้
biClrใช้แล้วกำหนดจำนวนสีที่ใช้จากตาราง หากค่านี้เป็นศูนย์ แรสเตอร์จะใช้จำนวนสีสูงสุดที่ค่า biBitCount อนุญาต สิ่งนี้เกี่ยวข้องกับรูปภาพที่บีบอัดเท่านั้น หาก biClrUsed ไม่เป็นศูนย์และ biBitCount น้อยกว่า 16 ดังนั้น biClrUsed จะกำหนดจำนวนสีของเอ็นจิ้นกราฟิกหรือไดรเวอร์อุปกรณ์ในปัจจุบัน หาก biBitCount มากกว่าหรือเท่ากับ 16 ดังนั้น biClrUsed จะกำหนดขนาดของตารางสีที่ใช้ในการปรับชุดสีของระบบปัจจุบันให้เหมาะสม
biClrสำคัญ- นี่คือจำนวนสีที่สำคัญ กำหนดจำนวนสีที่จำเป็นสำหรับการวาดภาพ หากค่านี้เป็น 0 (ตามปกติ) สีทั้งหมดจะถือว่ามีความสำคัญ

ประเภทของรูปแบบ BMP

รูปแบบ bmp ทุกประเภท ตามเงื่อนไขสามารถแบ่งออกได้เป็น 2 ประเภท: จานสีและไม่ใช่จานสี นั่นคือไม่ว่าจะใช้จานสีในรูปแบบที่กำหนดหรือไม่ก็ตาม โปรดทราบว่าจานสีสามารถอยู่ในรูปแบบที่ไม่มีจานสีได้ แต่ไม่ได้ใช้ที่นั่น ใน bmps แบบไร้จานสี สีจะถูกคำนวณโดยตรงจากบิตที่อยู่ในไฟล์ โดยเริ่มจากตำแหน่งใดตำแหน่งหนึ่ง และในจานสี แต่ละไบต์จะอธิบายพิกเซลตั้งแต่หนึ่งพิกเซลขึ้นไป และค่าไบต์ (หรือบิต) คือดัชนีสีในจานสี ขั้นแรก ฉันจะจัดเตรียมตารางเปรียบเทียบตัวเลือกที่เป็นไปได้ ชนิดของรูปภาพ (จานสีหรือไม่มีจานสี) ขึ้นอยู่กับจำนวนบิตที่ได้รับต่อพิกเซล ซึ่งก็คือค่า biBitCount ของโครงสร้าง BITMAPINFOHEADER

biBitCountรูปแบบจานสีหรือไม่ใช่จานสีจำนวนสีสูงสุดที่เป็นไปได้หมายเหตุ 1 จานสี2 ภาพสองสี ไม่จำเป็นต้องเป็นภาพขาวดำเสมอไป หากบิตแรสเตอร์ (ซึ่งอยู่ด้านล่าง) ถูกรีเซ็ต (เท่ากับ 0) นั่นหมายความว่าสีแรกจากจานสีควรอยู่ในตำแหน่งนี้ และหากตั้งค่าไว้ (เท่ากับ 1) แสดงว่าสีที่สอง 4 จานสี16 แต่ละไบต์อธิบาย 2 พิกเซล นี่คือตัวอย่างจาก MSDN หากไบต์แรกในภาพคือ 0x1F แสดงว่าสอดคล้องกับสองพิกเซล สีของไบต์แรกจะเป็นสีที่สองจากจานสี (เนื่องจากการนับถอยหลังเริ่มจากศูนย์) และพิกเซลที่สองคือ สีที่ 16 ของจานสี 8 จานสี256 หนึ่งในตัวเลือกที่พบบ่อยที่สุด แต่ในขณะเดียวกันสิ่งที่ง่ายที่สุด จานสีใช้เวลาหนึ่งกิโลไบต์ (แต่อย่านับจะดีกว่า) หนึ่งไบต์คือสีเดียว นอกจากนี้ค่าของมันคือหมายเลขสีในจานสี 16 ไม่มีจานสี2^16 หรือ 2^15นี่เป็นตัวเลือกที่น่าสับสนที่สุด เริ่มจากความจริงที่ว่ามันไม่มีจานสี นั่นคือทุก ๆ สองไบต์ (หนึ่งคำคำ) ในแรสเตอร์จะกำหนดหนึ่งพิกเซลโดยไม่ซ้ำกัน แต่สิ่งที่เกิดขึ้น: มี 16 บิต และมีส่วนประกอบ 3 สี (แดง เขียว น้ำเงิน) แต่ 16 ไม่อยากหารด้วย 3. ดังนั้นจึงมีสองตัวเลือกที่นี่ อย่างแรกคือใช้ไม่ใช่ 16 แต่เป็น 15 บิต จากนั้นจะมี 5 บิตสำหรับแต่ละองค์ประกอบสี วิธีนี้เราสามารถใช้สีได้สูงสุด 2^15 = 32768 สี และได้ R-G-B สามเท่า = 5-5-5 แต่แล้ว 16 แต้มทั้งหมดก็สูญเปล่าไปโดยเปล่าประโยชน์ แต่มันก็เกิดขึ้นที่ดวงตาของเรา ในบรรดาสีทั้งหมด รับรู้สีเขียวได้ดีขึ้น ดังนั้นเราจึงตัดสินใจมอบส่วนนี้ให้กับองค์ประกอบสีเขียวเล็กน้อย นั่นคือ จากนั้นเราจะได้ R-G-B สามเท่า = 5-6-5 และตอนนี้เราสามารถใช้ 2^16 = 65536 สีได้ แต่สิ่งที่ไม่พึงประสงค์ที่สุดคือใช้ทั้งสองตัวเลือก MSDN แนะนำว่าเพื่อแยกแยะจำนวนสีที่ใช้ ให้กรอกฟิลด์ biClrUsed จากโครงสร้าง BITMAPINFOHEADER ด้วยค่านี้ ในการเลือกแต่ละส่วนประกอบ คุณต้องใช้มาสก์ต่อไปนี้ สำหรับรูปแบบ 5-5-5: 0x001F สำหรับส่วนประกอบสีน้ำเงิน 0x03E0 สำหรับสีเขียว และ 0x7C00 สำหรับสีแดง สำหรับรูปแบบ 5-6-5: 0x001F - สีน้ำเงิน, 0x07E0 - สีเขียว และส่วนประกอบสีแดง 0xF800 ตามลำดับ 24 ไม่มีจานสี2^24 และนี่คือรูปแบบที่ง่ายที่สุด ที่นี่ 3 ไบต์กำหนดองค์ประกอบสี 3 สี นั่นคือหนึ่งองค์ประกอบต่อไบต์ เราเพียงแค่อ่านโครงสร้าง RGBTRIPLE และใช้ฟิลด์ rgbtBlue, rgbtGreen, rgbtRed พวกเขาไปตามลำดับนั้น 32 ไม่มีจานสี2^32 ที่นี่ 4 ไบต์กำหนด 3 องค์ประกอบ แต่อย่างไรก็ตาม ไม่ได้ใช้หนึ่งไบต์ สามารถใช้กับช่องอัลฟ่าได้ (โปร่งใส) ในกรณีนี้ จะสะดวกในการอ่านแรสเตอร์โดยใช้โครงสร้าง RGBQUAD ซึ่งมีคำอธิบายดังนี้:

การจัดเก็บข้อมูลในรูปแบบ bmp

ตอนนี้เรามาถึงส่วนที่น่าสนใจที่สุดแล้ว หลังจากที่โครงสร้าง BITMAPFILEHEADER และ BITMAPINFOHEADER มาถึงจานสี ยิ่งกว่านั้นหากรูปแบบไม่มีจานสีก็อาจไม่อยู่ที่นั่น แต่คุณไม่ควรเชื่อใจมัน ความจริงก็คือตอนที่ฉันเพิ่งเริ่มเข้าใจรูปแบบ bmp ฉันอ่านเจอในหนังสือเล่มหนึ่งว่า ถ้ารูปแบบนั้นไม่มีพาเล็ต ก็จะไม่มีพาเล็ตเลย มีรูปภาพสองรูปด้วยซ้ำ - ฟอร์แมตไดอะแกรม: รูปหนึ่งมีจานสีและอีกรูปไม่มี และตอนนั้นฉันกำลังเขียนโปรแกรมที่ขยันทำงานกับไฟล์ bmp และฉันต้องแปลงภาพที่เข้ามาจาก 256 สีเป็น 24 บิต (ถ้ามี) เป็นไฟล์ชั่วคราว และฉันไม่ได้สร้างจานสีในแบบ 24 บิต (bfOffBits จากโครงสร้าง BITMAPFILEHEADER เท่ากับผลรวมของขนาดของ (BITMAPFILEHEADER) + ขนาดของ (BITMAPINFOHEADER) และปล่อยให้ 24 บิตที่เข้ามาไม่เปลี่ยนแปลง ด้วยแรสเตอร์ 256 สีทุกอย่าง ทำงานอย่างที่ควรจะเป็นจนกระทั่งฉันไม่พบรูปภาพ 24 บิตที่มีขยะแสดงที่ด้านล่างแทนที่จะเป็นส่วนที่ต้องการ ฉันไม่เข้าใจทันทีว่ามีอะไรผิดปกติจนกระทั่งฉันเปรียบเทียบขนาดของไฟล์ต้นฉบับกับ ตามทฤษฎีที่ควรจะมีหากไม่มีจานสี ความแตกต่างคือ 1,024 ไบต์) มีจานสีอยู่ด้วย (แม้ว่ารูปภาพทั้งหมดที่ฉันเจอจะมีขนาดจานสี 256 สีหรือ 1Kb) ก็ตาม จะต้องเลื่อนผ่านไฟล์ไปที่จุดเริ่มต้นของแรสเตอร์เสมอ โดยใช้ bfOffBits ไม่ได้ใช้สีทั้งหมดในจานสี (แต่เช่น 16 เท่านั้น) จากนั้นมักจะจัดสรร 256 ฟิลด์สำหรับจานสี A 256 * 4 = 1,024 4 คือขนาดของโครงสร้าง RGBQUAD นั่นคือหนึ่งกิโลไบต์เดียวกันนั้น จะได้รับ

ทันทีหลังจากจานสีจะมีแรสเตอร์มาเอง นี่คือสิ่งที่ทำให้เกิดความสับสนมากขึ้น ประการแรก มีการอธิบายพิกเซลไว้ที่นี่ตามที่เขียนไว้ในตารางด้านบน ขึ้นอยู่กับรูปแบบ และพวกเขาสามารถมีค่าของส่วนประกอบสีได้ (สำหรับองค์ประกอบที่ไม่มีจานสี) หรืออาจเป็นดัชนีของอาร์เรย์จานสีก็ได้ ภาพจะถูกบันทึกทีละบรรทัด ประการที่สองภาพดูเหมือนจะกลับหัว นั่นคือบรรทัดล่างจะถูกเขียนก่อน จากนั้นจึงเขียนบรรทัดสุดท้าย และต่อๆ ไปจนถึงบนสุด และประการที่สาม ตามที่เขียนไว้ ถ้าขนาดของบรรทัดแรสเตอร์ไม่เป็นผลคูณของ 4 ก็จะถูกเติมด้วยไบต์ว่าง (ศูนย์) 1 ถึง 3 ไบต์ เพื่อให้ความยาวของบรรทัดเป็นผลคูณของย่อหน้า นี่เป็นสิ่งที่ไม่พึงประสงค์ที่สุด ความจริงก็คือสำหรับแต่ละรูปแบบคุณต้องปรับจำนวนไบต์ว่างนี้ (แม้ว่าฉันจะชอบเขียนส่วนหนึ่งของจานสีที่นั่น แต่ฉันไม่ต้องการสร้างตัวแปร "ศูนย์" เพิ่มเติมหากไบต์เหล่านี้ถูกข้ามไปและไม่มีใครเลย ต้องการพวกเขา) ฉันจัดทำตารางพร้อมสูตรที่แสดงจำนวนไบต์ที่ควรเพิ่มที่ท้ายบรรทัดสำหรับรูปแบบใด คุณอาจเดาได้ว่าตัวแปรความกว้างหมายถึงความกว้างของรูปภาพ สูตรทั้งหมดนี้ถูกสร้างขึ้นโดยการทดลอง ฉันจะยกตัวอย่างเฉพาะรูปแบบที่ใช้มากที่สุดเท่านั้น ที่เหลือเขียนเองได้

ตัวอย่างโปรแกรม

คุณสามารถดาวน์โหลดแหล่งข้อมูลทั้งหมดได้ ฉันจะไม่เขียนอะไรมากที่นี่ ฉันจะให้ฟังก์ชันพร้อมความคิดเห็น

สวัสดี 1. การสร้างรูปภาพในรูปแบบ bmp
นี่คือภาพเอกรงค์ที่ถูกสร้างขึ้น มีสามตัวอย่างของฟังก์ชันดังกล่าว: การสร้าง bmp 8, 16 และ 24 บิต ฉันจะให้เฉพาะ 16 บิตเท่านั้น

// มาสร้างรูปภาพในรูปแบบ bmp 16 บิต เช่น 5-5-5 ซึ่งจะเป็นสีเดียว
เป็นโมฆะ CreateBmp555 (ถ่าน * fname, สี WORD)
{
จัดการไฟล์ hFile;
DWORD RW;
อินท์ฉันเจ;

// ประกาศโครงสร้างที่จำเป็น
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER สอง;
ไบต์พาเลท[1024]; // จานสี

// ขอเป็นภาพขนาด 35 x 50 พิกเซล
ความกว้าง int = 35 ;
ความสูง int = 50 ;

memset(จานสี, 0, 1024); // ในจานสีเรามีศูนย์ เติมให้เต็ม
memset (&bfh, 0 , ขนาดของ (bfh) ) ;

Bfh.bfType = 0x4D42 ; // แสดงว่านี่คือ bmp "BM"
bfh.bfOffBits = ขนาดของ (bfh) + ขนาดของ (bih) + 1024 ; // จานสีใช้พื้นที่ 1Kb แต่เราจะไม่ใช้
bfh.bfSize = bfh.bfOffBits +
ขนาดของ(สี) * กว้าง * สูง +
ความสูง * ((ขนาดของ (สี) * ความกว้าง) % 4 ) ; // คำนวณขนาดของไฟล์สุดท้าย
memset (&bih, 0 , ขนาดของ (bih) ) ;
bih.biSize = ขนาดของ(bih); //มันก็ควรจะเป็นแบบนั้น.
bih.biBitCount = 16 ; // 16 บิตต่อพิกเซล
bih.biClrUsed = 32768 ; // เราใช้ 5-5-5
bih.biCompression = BI_RGB; //ไม่มีการบีบอัด
bih.biHeight = ส่วนสูง;
bih.biWidth = ความกว้าง;
bih.biPlanes = 1 ; // ควรจะเป็น 1
// และฟิลด์ที่เหลือยังคงเป็น 0

HFile = CreateFile (fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
ถ้า (hFile == INVALID_HANDLE_VALUE)
กลับ ;

// เขียนส่วนหัว
WriteFile (hFile, & bfh, ขนาดของ (bfh) , & RW, NULL ) ;
WriteFile (hFile, & bih, ขนาดของ (bih) , & RW, NULL ) ;

// เขียนจานสี
WriteFile(hFile, Palette, 1024, &RW, NULL);
สำหรับ (i = 0 ; i< Height; i++ )
{
สำหรับ (เจ = 0 ; เจ< Width; j++ )
{
WriteFile (hFile, & สี, ขนาดของ (สี) , & RW, NULL ) ;
}

// จัดแนวให้ตรงกับเส้นขอบ
WriteFile (hFile, Palette, (ขนาด (สี) * ความกว้าง) % 4 , & RW, NULL ) ;
}
CloseHandle(hFile);
}

สี - สีของภาพ ต้องกรอกค่าของตัวแปรนี้ตามตารางแรก คุณสามารถดูภาพผลลัพธ์ใน ACDSee ได้ เป็นต้น ฉันเพิ่งลองเปิดใน Photoshop แต่กลับกลายเป็นว่ามันไม่สามารถอ่านได้ในรูปแบบนี้ แต่คุณทำได้ :)

ตัวอย่างที่ 2 การแปลงรูปภาพจาก 8 บิต (256 สี) เป็น 24 บิต

BOOL Convert256To24 (ถ่าน * ครีบ, ถ่าน * fout)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER สอง;
int ความกว้าง ความสูง;
จานสี RGBQUAD[ 256 ] ;
ไบต์ * inBuf;
RGBTRIPLE * ออก Buf;
จัดการใน, hออก;
DWORD RW;
DWORD OffBits;
อินท์ฉันเจ;

HIn = CreateFile (ครีบ, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
ถ้า (hIn == INVALID_HANDLE_VALUE)
กลับเป็นเท็จ;

HOut = CreateFile (fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
ถ้า (hOut == INVALID_HANDLE_VALUE)
{
CloseHandle(hIn);
กลับเป็นเท็จ;
}

// อ่านข้อมูล
ReadFile (hIn, & bfh, ขนาดของ (bfh) , & RW, NULL ) ;
ReadFile (hIn, & bih, ขนาดของ (bih) , & RW, NULL ) ;
ReadFile (hIn, จานสี, 256 * ขนาดของ (RGBQUAD) , & RW, NULL ) ;

// ตั้งค่าตัวชี้ไปที่จุดเริ่มต้นของแรสเตอร์
SetFilePointer (hIn, bfh.bfOffBits, NULL, FILE_BEGIN) ;
ความกว้าง = bih.biWidth ;
ความสูง = ทวิความสูง ;
OffBits = bfh.bfOffBits ;

// จัดสรรหน่วยความจำ
inBuf = ไบต์ใหม่ [ ความกว้าง ] ;
outBuf = RGBTRIPLE ใหม่ [ความกว้าง] ;

// กรอกส่วนหัว
bfh.bfOffBits = ขนาดของ (bfh) + ขนาดของ (bih) ; // อย่าเขียนจานสีเลย
bih.biBitCount = 24 ;
bfh.bfSize = bfh.bfOffBits + 4 * กว้าง * สูง + สูง * (กว้าง % 4 ) ; //ขนาดไฟล์

// และส่วนที่เหลือยังคงไม่เปลี่ยนแปลง
// เขียนส่วนหัว
WriteFile (hOut, & bfh, ขนาดของ (bfh) , & RW, NULL ) ;
WriteFile (hOut, & bih, ขนาดของ (bih) , & RW, NULL ) ;

// มาเริ่มแปลงกันเลย
สำหรับ (i = 0 ; i< Height; i++ )
{
ReadFile(hIn, inBuf, ความกว้าง, & RW, NULL);
สำหรับ (เจ = 0 ; เจ< Width; j++ )
{
outBuf[ j].rgbtRed = จานสี[ inBuf[ j] ] .rgbRed ;
outBuf[ j].rgbtGreen = จานสี [ inBuf[ j] ] .rgbGreen ;
outBuf[ เจ].rgbtBlue = จานสี[ inBuf[ เจ] ] .rgbBlue ;
}
WriteFile (hOut, outBuf, ขนาดของ (RGBTRIPLE) * ความกว้าง, & RW, NULL ) ;

// เขียนขยะเพื่อการจัดตำแหน่ง
WriteFile (hOut, จานสี, ความกว้าง % 4 , & RW, NULL ) ;
SetFilePointer(hIn, (3 * ความกว้าง) % 4, NULL, FILE_CURRENT);
}

ลบ inBuf;
ลบ outBuf;
CloseHandle(hIn);
CloseHandle(hออก);
กลับจริง;
}

จะต้องส่งชื่อของไฟล์ต้นทางและปลายทางไปยังฟังก์ชันตามลำดับ

สาเหตุที่พบบ่อยที่สุดของปัญหาในการเปิดไฟล์ BMP คือการไม่มีแอปพลิเคชันที่เหมาะสมติดตั้งอยู่ในคอมพิวเตอร์ของคุณ ในกรณีนี้ เพียงค้นหา ดาวน์โหลด และติดตั้งแอปพลิเคชันที่ให้บริการไฟล์ในรูปแบบ BMP ก็เพียงพอแล้ว - โปรแกรมดังกล่าวมีให้ใช้งานด้านล่างนี้

ระบบค้นหา

กรอกนามสกุลไฟล์

ช่วย

เบาะแส

โปรดทราบว่าบางครั้งข้อมูลที่เข้ารหัสจากไฟล์ที่คอมพิวเตอร์ของเราไม่สามารถอ่านสามารถดูได้ใน Notepad ด้วยวิธีนี้เราจะอ่านส่วนของข้อความหรือตัวเลข - ควรตรวจสอบว่าวิธีนี้ใช้ได้ผลในกรณีของไฟล์ BMP หรือไม่

จะทำอย่างไรถ้าแอพพลิเคชั่นจากรายการได้รับการติดตั้งแล้ว?

บ่อยครั้งที่แอปพลิเคชันที่ติดตั้งควรลิงก์ไปยังไฟล์ BMP โดยอัตโนมัติ หากไม่เกิดขึ้น แสดงว่าไฟล์ BMP สามารถเชื่อมโยงด้วยตนเองกับแอปพลิเคชันที่ติดตั้งใหม่ได้สำเร็จ เพียงคลิกขวาที่ไฟล์ BMP จากนั้นเลือกตัวเลือก "เลือกโปรแกรมเริ่มต้น" จากรายการที่มีอยู่ จากนั้นคุณจะต้องเลือกตัวเลือก "ดู" และค้นหาแอปพลิเคชันที่คุณชื่นชอบ การเปลี่ยนแปลงที่ป้อนจะต้องได้รับการอนุมัติโดยใช้ตัวเลือก "ตกลง"

โปรแกรมที่เปิดไฟล์ BMP

หน้าต่าง
แมคโอเอส

เหตุใดฉันจึงไม่สามารถเปิดไฟล์ BMP ได้

ปัญหาเกี่ยวกับไฟล์ BMP อาจมีสาเหตุอื่นด้วย บางครั้งแม้แต่การติดตั้งซอฟต์แวร์บนคอมพิวเตอร์ของคุณที่รองรับไฟล์ BMP ก็ไม่สามารถแก้ปัญหาได้ สาเหตุของการไม่สามารถเปิดและทำงานกับไฟล์ BMP อาจเป็นดังนี้:

การเชื่อมโยงไฟล์ BMP ที่ไม่เหมาะสมในรายการรีจิสตรี
- ความเสียหายของไฟล์ BMP ที่เราเปิด
- การติดเชื้อไฟล์ BMP (ไวรัส)
- ทรัพยากรคอมพิวเตอร์น้อยเกินไป
- ไดรเวอร์ที่ล้าสมัย
- ลบส่วนขยาย BMP ออกจากรีจิสทรี Windows
- การติดตั้งโปรแกรมที่รองรับส่วนขยาย BMP ไม่สมบูรณ์

การแก้ไขปัญหาเหล่านี้ควรส่งผลให้สามารถเปิดและทำงานกับไฟล์ BMP ได้อย่างอิสระ ในกรณีที่คอมพิวเตอร์ของคุณยังมีปัญหากับไฟล์ คุณจะต้องได้รับความช่วยเหลือจากผู้เชี่ยวชาญซึ่งจะเป็นผู้ระบุสาเหตุที่แท้จริง

คอมพิวเตอร์ของฉันไม่แสดงนามสกุลไฟล์ ฉันควรทำอย่างไร?

ในการตั้งค่าระบบ Windows มาตรฐาน ผู้ใช้คอมพิวเตอร์จะไม่เห็นนามสกุลไฟล์ BMP สามารถเปลี่ยนแปลงได้สำเร็จในการตั้งค่า เพียงไปที่ "แผงควบคุม" และเลือก "ดูและการตั้งค่าส่วนบุคคล" จากนั้นคุณต้องไปที่ "ตัวเลือกโฟลเดอร์" และเปิด "มุมมอง" ในแท็บ "มุมมอง" มีตัวเลือก "ซ่อนนามสกุลของประเภทไฟล์ที่รู้จัก" - คุณต้องเลือกตัวเลือกนี้และยืนยันการดำเนินการโดยคลิกปุ่ม "ตกลง" ณ จุดนี้ นามสกุลของไฟล์ทั้งหมด รวมถึง BMP ควรจัดเรียงตามชื่อไฟล์

ประกาศ

รูปแบบไฟล์ภาพ BMP Raster

BMP (ไฟล์บิตแมป รูปแบบไฟล์บิตแมปที่ไม่ขึ้นอยู่กับอุปกรณ์) คือไฟล์บิตแมปที่ใช้จัดเก็บภาพบิตแมปดิจิทัลแยกจากอุปกรณ์แสดงผล ไฟล์ประเภทนี้เคยใช้ใน Microsoft Windows และ OS/2 คำว่า "แรสเตอร์" มาจากแนวคิดของโปรแกรมเมอร์เกี่ยวกับบิตแมป โดยทั่วไป รูปภาพ BMP จะไม่มีการบีบอัดหรือบีบอัดแบบไม่สูญเสียคุณภาพ (เช่น การใช้ ZIP หรือ RAR เนื่องจากมีข้อมูลที่ซ้ำซ้อนในไฟล์) ปัจจุบัน JPG เป็นรูปแบบภาพที่ต้องการ - สาเหตุหลักมาจากขนาดไฟล์ที่ใหญ่ของ BMP ซึ่งอาจทำให้เกิดปัญหาหรือความล่าช้าในการดาวน์โหลด ส่ง หรืออัพโหลดไฟล์

ข้อมูลทางเทคนิคเกี่ยวกับไฟล์ BMP

ไฟล์ BMP จะถูกจัดเก็บเป็นภาพ 2 มิติในขนาด สี และความลึกของสีต่างๆ โดยไม่มีการบีบอัดข้อมูล โปรไฟล์สี หรือช่องอัลฟ่า รูปภาพ BMP จะถูกบันทึกในรูปแบบบิตแมปที่ไม่ขึ้นกับอุปกรณ์ (DIB) ซึ่งหมายความว่ารูปภาพจะมีสีมากกว่าข้อกำหนดของระบบ สิ่งนี้จะอธิบายว่าทำไมอิมเมจ BMP บางรูปจึงดูแตกต่างไปในคอมพิวเตอร์แต่ละเครื่อง ภาพ BMP สามารถดูได้บนอุปกรณ์ทุกชนิด รวมถึงหน้าจอคอมพิวเตอร์และโทรทัศน์ การไม่มีสิทธิบัตรทำให้รูปแบบรูปภาพนี้กลายเป็นรูปแบบยอดนิยมสำหรับอุปกรณ์หลากหลายประเภท

ข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ BMP

เราหวังว่าเราจะช่วยคุณแก้ไขปัญหาเกี่ยวกับไฟล์ BMP หากคุณไม่ทราบว่าคุณสามารถดาวน์โหลดแอปพลิเคชันจากรายการของเราได้ที่ไหน ให้คลิกที่ลิงก์ (นี่คือชื่อของโปรแกรม) - คุณจะพบข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับตำแหน่งที่จะดาวน์โหลดเวอร์ชันการติดตั้งที่ปลอดภัยของแอปพลิเคชันที่จำเป็น

มีอะไรอีกที่อาจทำให้เกิดปัญหา?

อาจมีสาเหตุหลายประการที่ทำให้คุณไม่สามารถเปิดไฟล์ BMP ได้ (ไม่ใช่เพียงการขาดแอปพลิเคชันที่เกี่ยวข้อง)
ประการแรก- ไฟล์ BMP อาจมีการเชื่อมโยงอย่างไม่ถูกต้อง (เข้ากันไม่ได้) กับแอปพลิเคชันที่ติดตั้งเพื่อรองรับ ในกรณีนี้ คุณต้องเปลี่ยนการเชื่อมต่อนี้ด้วยตนเอง โดยคลิกขวาที่ไฟล์ BMP ที่คุณต้องการแก้ไข คลิกตัวเลือก “เปิดด้วย”จากนั้นเลือกโปรแกรมที่คุณติดตั้งจากรายการ หลังจากดำเนินการนี้ ปัญหาในการเปิดไฟล์ BMP ควรจะหายไปโดยสิ้นเชิง
ประการที่สอง- ไฟล์ที่คุณต้องการเปิดอาจเสียหายได้ ในกรณีนี้ ควรค้นหาเวอร์ชันใหม่หรือดาวน์โหลดอีกครั้งจากแหล่งเดียวกัน (อาจด้วยเหตุผลบางประการในเซสชันก่อนหน้า การดาวน์โหลดไฟล์ BMP ไม่เสร็จสิ้นและไม่สามารถเปิดได้อย่างถูกต้อง) .

คุณต้องการที่จะช่วย?

หากคุณมีข้อมูลเพิ่มเติมเกี่ยวกับนามสกุลไฟล์ BMP เราจะยินดีอย่างยิ่งหากคุณแบ่งปันกับผู้ใช้ไซต์ของเรา ใช้แบบฟอร์มที่มีอยู่และส่งข้อมูลของคุณเกี่ยวกับไฟล์ BMP ให้เรา

บ่อยครั้งเมื่อทำงานกับกราฟิก ผู้ใช้จำนวนมากพบรูปภาพในรูปแบบ BMP ปัจจุบันน้อยคนนักที่จะรู้ว่ามันคืออะไร ตอนนี้เราจะดูรายละเอียดเพิ่มเติมเกี่ยวกับรูปแบบกราฟิก BMP ยิ่งไปกว่านั้น เราจะไม่เพียงแต่ติดตามประวัติความเป็นมาของต้นกำเนิดและวิวัฒนาการของมันเท่านั้น แต่ยังนำเสนอวิธีการง่ายๆ ในการแปลงเป็นรูปแบบยอดนิยมอื่นๆ อีกด้วย

รูปแบบ BMP คืออะไร

อย่าไปลงรายละเอียดทางเทคนิคมากเกินไป โปรดทราบว่า BMP เป็นรูปแบบสำหรับจัดเก็บภาพกราฟิกในรูปแบบบิตแมปโดยอิงจากแรสเตอร์ชั้นเดียว

ใช่นี่เป็นเรื่องจริง เริ่มแรก รูปแบบภาพ BMP ใช้กับภาพแรสเตอร์โดยเฉพาะ และเป็นส่วนขยายสากล (มาตรฐาน) สำหรับกราฟิกทั้งหมดโดยทั่วไป

ประวัติความเป็นมา

ประวัติความเป็นมาของการสร้างรูปแบบนี้เชื่อมโยงกับ Microsoft Corporation อย่างแยกไม่ออกซึ่งนำมาใช้ครั้งแรกในผลิตผลหลักนั่นคือระบบปฏิบัติการ Windows นอกจากนี้ แม้ว่าจะมีการแข่งขันกับ Apple อย่างต่อเนื่อง แต่ก็มีการประกาศรองรับกราฟิกประเภทนี้สำหรับระบบปฏิบัติการ OS/2 ในภายหลัง

จริงอยู่ตั้งแต่นั้นมารูปแบบกราฟิก BMP ก็มีการเปลี่ยนแปลงมากมาย เดิมทีสันนิษฐานว่าโครงสร้างของภาพสร้างขึ้นจากการรวมกันของสี่เหลี่ยมเล็กๆ ซึ่งปัจจุบันเรียกว่าพิกเซล เชื่อกันว่าแต่ละพิกเซลในภาพสามารถมีข้อมูลเกี่ยวกับความลึกของสีที่แตกต่างกัน (จำนวนบิตต่อหน่วยกราฟิกดังกล่าว) ค่าที่ใช้ระบุความลึกบิตสีมีดังนี้ 1, 2, 4, 8, 16, 24, 32, 48, 64 บิต

ในกรณีนี้สำหรับค่าที่น้อยกว่า 8 สีจะถูกระบุโดยใช้ดัชนีของจานสี (ตาราง) ของเฉดสีเท่านั้นและสำหรับค่าที่สูงกว่าดัชนีนั้นจะนำมาจากโมเดล RGB มาตรฐาน อย่างหลังประกอบด้วยสีต่างๆ ที่ได้จากการผสมสีแดง เขียว และน้ำเงิน

ตามที่ชัดเจนแล้ว ยิ่งความลึกของบิตสูงเท่าไร ขนาดของภาพสุดท้ายก็จะยิ่งใหญ่ขึ้นเท่านั้น ต้องบอกว่ารูปแบบไฟล์ BMP ทั้งในยุคห่างไกลเหล่านั้นและในปัจจุบันดูเหมือนมาสโตดอนชนิดหนึ่งเพราะขนาดค่อนข้างใหญ่ นี่เป็นเพราะความจริงที่ว่ารูปภาพนั้นไม่มีการบีบอัดเมื่อเปรียบเทียบกับรูปแบบ JPG เดียวกัน ขนาดของไฟล์ที่มีนามสกุลต่าง ๆ ที่มีรูปภาพเดียวกันอาจแตกต่างกันไม่เพียงหลายร้อยถึงหมื่นครั้งเท่านั้น

วิธีการเปิดรูปแบบไฟล์ BMP?

สำหรับการเปิดอิมเมจประเภทนี้ ระบบปฏิบัติการ Windows ใด ๆ มีเครื่องมือในตัวสำหรับสิ่งนี้

จนกว่าจะมีการสร้างแอปพลิเคชันสำหรับดู เครื่องมือแก้ไขหลักยังคงเป็นโปรแกรม Paint ที่มาพร้อมกับ Windows เวอร์ชันใดก็ได้ ในเวลานั้นแอปพลิเคชันนี้รองรับรูปแบบ BMP โดยเฉพาะ

ตามที่ชัดเจนแล้วด้วยการพัฒนาเทคโนโลยีและวิวัฒนาการของรูปแบบเอง โปรแกรมก็เปลี่ยนไปเช่นกัน ปัจจุบัน ความสามารถของ Paint นั้นยิ่งใหญ่กว่าความสามารถในเวอร์ชันเริ่มแรกมาก

นอกจากนี้ด้วยการถือกำเนิดของโปรแกรมสำหรับการดูและแก้ไขกราฟิกรูปแบบไฟล์ BMP ได้ประกาศในการสนับสนุนทางเทคนิคและในนั้น ไม่น่าแปลกใจเลย เนื่องจากเขาเป็น "ปู่ทวด" ของนามสกุลไฟล์รูปภาพเกือบทั้งหมดที่รู้จักในปัจจุบัน

คุณจะพบโปรแกรมมากมายสำหรับการทำงานกับข้อมูลกราฟิกดังกล่าว ในบรรดาเครื่องมือการรับชมเช่นใน Windows คุณสามารถใช้เครื่องมือมาตรฐานได้ ในบรรดาแอปพลิเคชันบุคคลที่สามแพ็คเกจซอฟต์แวร์เช่น ACDSee หรือ Irfan View และอื่น ๆ อีกมากมายค่อนข้างได้รับความนิยม

สำหรับการแก้ไข คุณสามารถใช้อะไรก็ได้ในการทำงาน เช่น Adobe Photoshop, Corel Draw หรือโปรแกรมแก้ไขกราฟิกอื่น ๆ ที่มีชุดเครื่องมือและความสามารถเพียงเล็กน้อย

วิธีที่ง่ายที่สุดในการแปลงรูปแบบ BMP

ตอนนี้เรามาดูวิธีเปลี่ยนรูปแบบ BMP ด้วยวิธีที่ง่ายที่สุด ในการทำเช่นนี้คุณสามารถใช้โปรแกรมแก้ไขกราฟิกเดียวกันได้

หากเราใช้แอปพลิเคชัน Paint มาตรฐานเป็นตัวอย่าง ขั้นแรกให้เปิดไฟล์ BMP ที่ต้องการ หลังจากนั้นเลือกคำสั่ง "บันทึกเป็น ... " จากเมนู "ไฟล์" ซึ่งอยู่ในรูทในบรรทัดล่างสุด (เมนูแบบเลื่อนลง) คุณจะพบรูปแบบที่รองรับ

ที่จริงแล้วในโปรแกรมแก้ไขกราฟิกอื่น ๆ เทคโนโลยีในการแปลงบิตแมปนั้นคล้ายคลึงกับที่อธิบายไว้ข้างต้น ในบางแอพพลิเคชั่น คุณยังสามารถค้นหาคำสั่งส่งออกได้ ซึ่งโดยหลักการแล้วจะไม่แตกต่างกันมากนัก เนื่องจากเมื่อใช้คำสั่งเหล่านี้ ขั้นตอนทั้งหมดจะเริ่มต้นอีกครั้งเพื่อเลือกรูปแบบกราฟิกอื่นที่รองรับ นอกเหนือจาก BMP ดั้งเดิม

การใช้ตัวแปลง

หนึ่งในวิธีที่ง่ายที่สุดในการแปลงรูปภาพประเภทต่างๆ เป็นรูปแบบ BMP ไม่ต้องพูดถึงโดยใช้เครื่องมือมาตรฐานของ Windows และโปรแกรมแก้ไขกราฟิก คือการใช้ตัวแปลงพิเศษที่ทำงานโดยอัตโนมัติ

ทุกอย่างเรียบง่ายที่นี่ ผู้ใช้เพิ่มไฟล์กราฟิกที่จะแปลงเป็นหน้าต่างโปรแกรม จากนั้นเลือกรูปแบบสุดท้าย (ในกรณีนี้คือ BMP) แล้วกดปุ่มเพื่อเริ่มกระบวนการแปลง ไฟล์สุดท้ายในรูปแบบใหม่จะถูกบันทึกไว้ในโฟลเดอร์ที่มีการกำหนดตำแหน่งเป็นค่าเริ่มต้นในแอปพลิเคชันหรือระบุด้วยตนเอง

อย่างไรก็ตาม เช่นเดียวกับกระบวนการย้อนกลับ เมื่อคุณต้องการแปลงรูปแบบ BMP ไปเป็นรูปแบบอื่น

ด้วยโปรแกรมมากมายในพื้นที่นี้บนอินเทอร์เน็ต คุณจะพบแหล่งข้อมูลมากมายที่ช่วยให้คุณสามารถดำเนินการเปลี่ยนแปลงดังกล่าวทางออนไลน์ได้ เฉพาะในกรณีนี้ ผู้ใช้จะอัปโหลดไฟล์ไปยังไซต์ เลือกรูปแบบสุดท้าย จากนั้นดาวน์โหลดผลลัพธ์ลงในคอมพิวเตอร์ของเขา เห็นด้วยเมื่อเทียบกับสองวิธีแรกไม่สะดวกมาก

บทสรุป

นั่นคือทั้งหมดที่สามารถพูดเกี่ยวกับรูปแบบกราฟิก BMP โดยสรุปได้ ด้วยเหตุผลที่ชัดเจน จึงไม่พิจารณาด้านเทคนิคของปัญหาในแง่ของโครงสร้างไฟล์ ข้อมูลดังกล่าวไม่น่าจะบอกอะไรผู้ใช้โดยเฉลี่ยได้

โดยสรุป ฉันต้องการเพิ่มคำสองสามคำเกี่ยวกับการแปลงไฟล์กราฟิกเป็นรูปแบบ BMP ที่ไม่มีการบีบอัด แน่นอนว่าเวอร์ชันปัจจุบันใช้พื้นที่ดิสก์น้อยกว่า แต่ก็ยังแตกต่างจากประเภทข้อมูลที่ถูกบีบอัดที่ทันสมัยกว่า โดยหลักการแล้ว รูปแบบ BMP เองก็สามารถเรียกได้ว่าค่อนข้างล้าสมัย เนื่องจากมีเพียงไม่กี่คนที่ใช้ในปัจจุบัน ดังนั้นการแปลงรูปแบบการบีบอัดให้เป็นไฟล์กราฟิกที่มีนามสกุล .bmp จึงดูเหมือนไม่สามารถทำได้อย่างชัดเจนในปัจจุบัน

นามสกุลไฟล์ .bmp
หมวดหมู่ไฟล์
ไฟล์ตัวอย่าง (2.7 ไมล์)
(487.85 กิโลไบต์)
โปรแกรมที่เกี่ยวข้อง Adobe Photoshop
เอ็มเอส เพ้นท์
โปรแกรมแก้ไขภาพไมโครซอฟต์
พู่กัน