Yahoo奇摩知識+將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+服務將會轉為唯讀模式。其他Yahoo奇摩產品與服務或您的Yahoo奇摩帳號都不會受影響。如需關於Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

再把BMP檔讀取後顯示到視窗畫布使用OpenGL

以下是Jacob所提供的讀BMP函式我只看的懂他大概的運作原理

可是我不知道要怎麼把讀出來的數值轉換顯示到OpenGL的畫布上

我之前是想過直接顯示在SDK的DC畫布上不過都失敗(自己寫的顯示函式都出錯),後來看到OpenGL在這方面有很好用的函式,好像是提供座標還有數據他就可以顯示出來,不過這方面我手上的書籍都是聖經版的原文書(電子書版本),看到眼睛快脫窗還是看不懂。

手上有個簡單的File System,原本打算把圖片全部押進那個裡面,在使用API去讀出來玩,可是API只支援一般的檔案系統,不支援自訂的,Jacob這個函式剛好可史用自訂檔案結構,可是在顯示部分我拿他沒則,如果各位高手知道怎麼解決還望止點一下

int read_bmp(char *filename, unsigned char ***bmp, int *height, int *width)

{ long *hed;

int i, j, k, w;

unsigned char head[1079], mod, *tmp_buf;

FILE *f;

hed = (long *) &head[2];

if ((f = fopen(filename, "rb")) == NULL) return 1;

if (fread(head, 1, 54, f) != 54) return 2;

if (head[0] != 'B' || head[1] != 'M') return 3;

fseek(f, 0, SEEK_END);

if (ftell(f) != hed[0]) return 4;

mod = head[28];

if (mod != 24) return 5;

if (head[30]) return 6;

*width = hed[4], *height = hed[5];

if ((tmp_buf = (unsigned char *) malloc(hed[8])) == NULL)

return 7;

if ( !(*bmp = (unsigned char **)malloc(*height *sizeof(**bmp))))

return 8;

if ( (**bmp = (unsigned char *) malloc(*width*3 * *height + 7)) == NULL)

return 9;

fseek(f, hed[2], SEEK_SET);

if (fread(tmp_buf, 1, (size_t)hed[8]-1, f) != hed[8]-1)

return 10;

for (w=i=0; i<*height; i++, w+=*width*3)

(*bmp)[i] = &(**bmp)[w];

w = *width * 3;

w = (((w-1)>>2) +1) << 2;

for (i=(int)(*height-1); i>=0; i--)

{ k = *height - i -1;

for (j=0; j<*width*3; j++)

(*bmp)[k][j] = tmp_buf[i*w + j];

}

free(tmp_buf);

if (fclose(f)) return 11;

return 0;

}

已更新項目:

程式碼比這個還簡短好用

可以在研究看看了

3 個解答

評分
  • ?
    Lv 7
    1 0 年前
    最佳解答

    用了我的程式來問,不答似乎說不過去。

    不過,我不是用我的 BMP 程式來答的!

    不過,主程式是我寫的啦!

    圖片參考:http://tw.yimg.com/i/tw/blog/rte/smiley_1.gif

    詳情請看我討論區的這篇。

    沒空把它寫到完善;

    不過,不但達到版大的需求,包括:

     1. 用 OpenGL。

     2. 寫程式讀 BMP。

     3. 用 OpenGL texture (畫布)

    且已超過版大的需求,包括

     1. 沒有 texture 大小必需是 2n * 2n 的限制!

     2. 用 list 來加速。

     3. 可以用滑鼠旋轉。

     4. 可以 resize 視窗大小。

     5. 程式自訂使用 TXT.BMP;可用第一參數來改變顯示的 BMP檔。

    程式裡的註量不多。

    若有 OpenGL 基礎、有看不懂的地方,可以來信。

    (沒有OpenGL基礎的請自行先學一點,謝謝。)

    2007-12-20 13:55:22 補充:

    應網友要求,再加了兩個功能:平移、縮放。

    2007-12-21 02:11:52 補充:

    它短的原因在它是一唯。

    它好用的主因是它有定義 struct!

    我本來也想要定義 struct,後來想把它延到我熟悉 JPG, GIF, 和 PNG 後。

    這樣,可能會定出好一點的 struct。

    不過,恩師畢竟是 60 歲的 CS 正教授,

    而且是某名校畢、在另一名校任教20年才轉來,

    並研究教育!

    所以,他的程式真的拿來學,效果很好!

    (他看重學,他不看重快、省RAM!

     所以,要學快、省 RAM,他的 code 不是好對象!

     要學觀念,他的 code 是上選!)

  • 1 0 年前

    小琪大姐,你也弄一個來試試不然單Jacob大師跟他的老師的,有點少,大姐你也寫一個來供小弟參考吧。

  • ?
    Lv 5
    1 0 年前

    To: Jacob Lee

    還有一個原因讓你老師的程式比你簡短:

      他只有四個錯誤處理,

      你有11個。

     你的錯誤分類比他詳細,但說明比他的少。

    但,

    他的的確比較好讀、也比較像教學程式;

    你的比較像專業程式,只是註太少了。

    2007-12-25 00:35:07 補充:

    那兩個 BMP 程式寫得很好,小女子寫的不會比他們的好。

    至於用 texture 顯示圖檔,Jacob 寫得不錯啊,簡單功能又多,

    我就把它收下囉!

    Jacob, 謝啦!^_^

還有問題?馬上發問,尋求解答。