我需要讀取一個 bmp 檔案并將其顯示為 1 和 0 的二維陣列

如果像素為藍色,則陣列中的值為 1,白色為 0。
unsigned int temp;
int i, j, width, hight;
int** bmp;
FILE* pic;
fopen_s(&pic, "fishpool2.bmp", "rb");
pic_size(pic, &width, &hight);
printf_s("width = %d\thight = %d\n", width, hight);
fseek(pic, 54, SEEK_SET);
for (i = 0; i < hight; i ) {
for (j = 0; j < width; j ) {
temp = fgetc(pic);
fgetc(pic);
fgetc(pic);
if (temp >= 155 && temp <= 245) bmp[i][j] = 1;
}
}
for (i = 0; i < hight; i ) {
for (j = 0; j < width; j ) {
printf_s("%d", bmp[i][j]);
}
puts("");
}
這就是我到目前為止所擁有的。我沒有在分配記憶體和獲取圖片的高度和寬度時包含代碼部分。我不知道為什么,但是當我運行代碼時,藍點不在正確的位置。
(我需要從左下角到右上角閱讀圖片)

uj5u.com熱心網友回復:
讀這個。
BMP 檔案格式 - 維基百科
BMP 檔案格式很復雜,有很多變體。您查看了哪些檔案并撰寫了代碼?而且您似乎將自己限制在要讀取的特定格式和引數上,這是否與您嘗試讀取的實際檔案相匹配?
uj5u.com熱心網友回復:
兩個連續行之間的步幅四舍五入為 4 個位元組。來自https://en.wikipedia.org/wiki/BMP_file_format#Pixel_array_(bitmap_data)
出于檔案存盤目的,只有每行的大小必須是 4 位元組的倍數,而檔案偏移量可以是任意的。
因此,在您的情況下(寬度 = 110)。這意味著每行有 330 個位元組長。四舍五入到 4 的下一個重數,即 332。因此程式應該332-330 = 2在處理每一行后獲取額外的位元組:
for (i = 0; i < hight; i ) {
for (j = 0; j < width; j ) {
temp = fgetc(pic);
fgetc(pic);
fgetc(pic);
if (temp >= 155 && temp <= 245) bmp[i][j] = 1;
}
// fetch 2 extra bytes
fgetc(pic);
fgetc(pic);
}
更強大的解決方案可能是:
size_t row_size = width * 3;
size_t row_size_rounded = (row_size 3) / 4 * 4;
size_t padding = rows_size_rounded - rows_size;
...
for (i = 0; i < hight; i ) {
for (j = 0; j < width; j ) {
...
}
for (size_t p = 0; p < padding; p)
fgetc(pic);
}
uj5u.com熱心網友回復:
在處理眾所周知的檔案格式時,通常最好不要“重新發明輪子”。相反,您要尋找一個庫,該庫可以將這種格式讀取/決議為您的程式可以更輕松地使用的格式。例如,如果您在 GitHub 上搜索,您會發現幾個可以使用的 BMP 讀/寫庫。
或者你可以選擇 ImageMagic 的“瑞士軍刀”;看這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488051.html
標籤:C
