บทความนี้เกี่ยวกับลักษณะของรูปแบบกราฟิก 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 |
หมวดหมู่ไฟล์ | |
ไฟล์ตัวอย่าง | (2.7 ไมล์) (487.85 กิโลไบต์) |
โปรแกรมที่เกี่ยวข้อง | Adobe Photoshop เอ็มเอส เพ้นท์ โปรแกรมแก้ไขภาพไมโครซอฟต์ พู่กัน |