Tôi đang cố gắng tạo một bitmap trong C, chỉ từ mã. Tôi hiện đang cố gắng tạo một hình ảnh .bmp rất dễ, với chiều cao là 1px và chiều rộng là 4 pixel, với tất cả các pixel màu trắng. Tôi đã đọc mô tả định dạng và cố gắng áp dụng nó. Điều này dẫn đến đoạn mã sau:Tạo một tập tin BMP (bitmap) trong C
char bitmap[1000];
void BMPmake()
{
// -- FILE HEADER -- //
// bitmap signature
bitmap[0] = 'B';
bitmap[1] = 'M';
// file size
bitmap[2] = 66; // 40 + 14 + 12
bitmap[3] = 0;
bitmap[4] = 0;
bitmap[5] = 0;
// reserved field (in hex. 00 00 00 00)
for(int i = 6; i < 10; i++) bitmap[i] = 0;
// offset of pixel data inside the image
for(int i = 10; i < 14; i++) bitmap[i] = 0;
// -- BITMAP HEADER -- //
// header size
bitmap[14] = 40;
for(int i = 15; i < 18; i++) bitmap[i] = 0;
// width of the image
bitmap[18] = 4;
for(int i = 19; i < 22; i++) bitmap[i] = 0;
// height of the image
bitmap[22] = 1;
for(int i = 23; i < 26; i++) bitmap[i] = 0;
// reserved field
bitmap[26] = 1;
bitmap[27] = 0;
// number of bits per pixel
bitmap[28] = 24; // 3 byte
bitmap[29] = 0;
// compression method (no compression here)
for(int i = 30; i < 34; i++) bitmap[i] = 0;
// size of pixel data
bitmap[34] = 12; // 12 bits => 4 pixels
bitmap[35] = 0;
bitmap[36] = 0;
bitmap[37] = 0;
// horizontal resolution of the image - pixels per meter (2835)
bitmap[38] = 0;
bitmap[39] = 0;
bitmap[40] = 0b00110000;
bitmap[41] = 0b10110001;
// vertical resolution of the image - pixels per meter (2835)
bitmap[42] = 0;
bitmap[43] = 0;
bitmap[44] = 0b00110000;
bitmap[45] = 0b10110001;
// color pallette information
for(int i = 46; i < 50; i++) bitmap[i] = 0;
// number of important colors
for(int i = 50; i < 54; i++) bitmap[i] = 0;
// -- PIXEL DATA -- //
for(int i = 54; i < 66; i++) bitmap[i] = 0;
}
void BMPwrite()
{
FILE *file;
file = fopen("bitmap.bmp", "w+");
for(int i = 0; i < 66; i++)
{
fputc(bitmap[i], file);
}
fclose(file);
}
Khi tôi cố gắng để mở hình ảnh này, nó nói rằng hình ảnh bị hư hỏng. Am i thiếu cái gì ở đây?
Tôi cũng nhận thấy rằng việc mã hóa các số nguyên .bmp là ít kết thúc. Tôi nghĩ rằng điều này có nghĩa là tôi phải đảo ngược thứ tự các byte. Ví dụ, 256 trong bốn byte là: 00000000 00000000 00000001 00000000, và tôi nghĩ rằng trong ít endian này sẽ là: 00000000 00000001 00000000 00000000
Bất cứ ai có thể cho tôi một bàn tay ở đây? Tôi đang sử dụng một cách tiếp cận đúng? Bất kỳ trợ giúp sẽ được đánh giá cao!
Cảm ơn trước!
Vẽ hình ảnh mà bạn muốn tạo bằng trình chỉnh sửa đồ họa yêu thích của mình, sau đó thử sao chép byte theo byte. – dasblinkenlight
Bạn đã có sai số cuối cùng trên các trường có độ phân giải. Bạn sẽ tìm thấy công việc của mình dễ dàng hơn nhiều nếu bạn viết các hàm trợ giúp để lấy các số nguyên 2 byte và 4 byte và gộp chúng vào mảng byte của bạn cho bạn. –
dasblinkenlight, tôi đã thử làm điều đó trong Pixelmator (trên Mac), nhưng tôi có một tập tin bmp 84 byte trong khi tôi hy vọng nó là 66 byte, có lẽ tôi có thể thử mở nó với một chương trình cho thấy tôi byte mỗi byte;) – Devos50