討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
glut 教學 - 讀取 bmp圖檔
更改我的閱讀文章字型大小
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/12 上午 05:44:52
甚麼說呢...
OpenGL 是沒有對圖檔的直接支援的, 它的 API 只是對應 3D Rendering 必需的, glut 也沒有, 每一次有人問關於讀取圖檔的問題, 我也會很懶散的說, 用外面的 library 吧.

但是, 讀取圖檔的功能, 縱然自己做出來的功能可能較差, 但是, 自己有能力處理, 才會安心的. 或是當成是個練習, 也是好事.

好吧, 就讓我們去寫程式讀圖檔.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/12 上午 05:45:15
/////////////////////////
// g_bmp.h
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//

#ifndef G_BMP_H
#define G_BMP_H

class GBmp
{
  public:
    int w,h;
    unsigned char *rgb;

    GBmp();
    ~GBmp();

    void load( const char *spath );
    void load( int width, int height );
    void load( int width, int height, unsigned char *rgb_data );
    void save( const char *spath );
    void flip_vectical();

  private:
    void rb_swap();
};

#endif
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/12 上午 05:46:31
/////////////////////////
// glutTest01.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//

#include "g_bmp.h"

void main()
{
  GBmp tbmp;
    tbmp.load( "a.bmp" );
    tbmp.flip_vectical();
    tbmp.save( "b.bmp" );
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/12 上午 05:47:16
讀取 BMP 的部份, 在維持 易讀, 易用 和 盡量簡化 的原則下, 已是很簡單的.

glutTest01.cpp, 是一個範例, 它會讀入一個 a.bmp, 把它上下倒置, 然後存成叫 b.bmp 的檔案.

Bitmap 它支援很多種不同的資料格式, 如果要把 Bitmap 支援的都寫出來, 是很用人力的一件事, 因此, 我只寫了讀取 uncompressed RGB888 的 bitmap 檔 的功能, 用來存取 texture 這個應該夠用了.

如果你夠細心, 可能已發現 GBmp 這個 class, 除了, 存取的功能外, 只有一個上下倒置的功能, 提供這個功能的是有實質應用的, 就是, 由於 OpenGL 是假定 texture 都是 bottom-up scanline (由下而上) 的, 但是, bitmap 是 top-down scanline (由上而下), 因此, 把 bitmap 交給 OpenGL 之前, 你是必要把 bitmap 上下倒置的, 不然, 顯示出來的時候就會發生 texture 上下倒置 的情況.

作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/16 上午 11:44:04
/////////////////////////
// g_bmp.cpp
//
// Created by Gary Ho, ma_hty@hotmail.com, 2005
//

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

#include "g_bmp.h"

#pragma pack( push, 1 )
typedef struct _bmp_header_info
{
  unsigned short bfType;
  unsigned int bfSize;
  unsigned short bfReserved1;
  unsigned short bfReserved2;
  unsigned int bfOffBits;

  // bitmap header
  unsigned int biSize;
  int biWidth;
  int biHeight;
  unsigned short biPlanes;
  unsigned short biBitCount;
  unsigned int biCompression;
  unsigned int biSizeImage;
  int biXpelsPerMeter;
  int biYpelsPerMeter;
  unsigned int biClrUsed;
  unsigned int biClrImportant;
} bmp_header_info;
#pragma pack( pop, 1 )

GBmp::GBmp()
{
  memset( this, 0, sizeof(GBmp) );
}

GBmp::~GBmp()
{
  if(rgb!=NULL)
    free(rgb);
}

void GBmp::load( const char *spath )
{

  bmp_header_info bhi;
  {
    FILE *f0 = fopen( spath, "rb" );
     if( f0==NULL )
     {
     printf( "[Error] GBmp::load, file %s not found.\n", spath );
     exit(-1);
     }

     fread( &bhi, sizeof(bmp_header_info), 1, f0 );
    fclose(f0);
  }

  if( bhi.bfType != 'MB' )
  {
    printf( "[Error] GBmp::load, not bitmap file\n" );
    exit(-1);
  }

  if( bhi.biCompression != 0 )
  {
    printf( "[Error] GBmp::load, only uncompressed bitmap is supported\n" );
    exit(-1);
  }

  if( bhi.biBitCount != 24 )
  {
    printf( "[Error] GBmp::load, must be RGB888 bitmap\n" );
    exit(-1);
  }

  if(rgb) free(rgb);

  w = bhi.biWidth;
  h = bhi.biHeight;
  rgb = (unsigned char*) malloc( w*h*3*sizeof(unsigned char) );
  {
    FILE *f0 = fopen( spath, "rb" );
     fseek( f0, bhi.bfOffBits, SEEK_SET );
     int j;
     for( j=0; j<h; j++ )
     {
     fread( &rgb[j*w*3], sizeof(unsigned char), w*3, f0 );
     fseek( f0, (4-w*3%4)%4, SEEK_CUR );
     }
    fclose(f0);
  }
  rb_swap();
}

void GBmp::load( int width, int height )
{
  if(rgb) free(rgb);

  w = width;
  h = height;
  rgb = (unsigned char*) malloc( w*h*3*sizeof(unsigned char) );
  memset( rgb, 0, w*h*3*sizeof(unsigned char) );
}

void GBmp::load( int width, int height, unsigned char *rgb_data )
{
  if(rgb) free(rgb);

  w = width;
  h = height;
  rgb = (unsigned char*) malloc( w*h*3*sizeof(unsigned char) );
  memcpy( rgb, rgb_data, w*h*3*sizeof(unsigned char) );
}

void GBmp::flip_vectical()
{
  unsigned char* tmp_rgb = (unsigned char*) malloc( w*h*3*sizeof(unsigned char) );
  int j;
  for( j=0; j<h; j++ )
    memcpy( &tmp_rgb[j*w*3], &rgb[(h-j-1)*w*3], w*3*sizeof(unsigned char) );

  memcpy( rgb, tmp_rgb, w*h*3*sizeof(unsigned char) );

  free(tmp_rgb);
}

void GBmp::rb_swap()
{
  unsigned char tmp;
  int i,j;
  for( j=0; j<h; j++ )
    for( i=0; i<w; i++ )
    {
     tmp = rgb[(j*w+i)*3];
     rgb[(j*w+i)*3] = rgb[(j*w+i)*3+2];
     rgb[(j*w+i)*3+2] = tmp;
    }
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/16 上午 11:44:20
void GBmp::save( const char *spath )
{
  bmp_header_info bhi;
    bhi.bfType = 'MB';
    bhi.bfSize = w*h*3*sizeof(unsigned char) + sizeof(bhi);
    bhi.bfReserved1 = 0;
    bhi.bfReserved2 = 0;
    bhi.bfOffBits = sizeof(bhi);

    bhi.biSize = 40;
    bhi.biWidth = w;
    bhi.biHeight = h;
    bhi.biPlanes = 1;
    bhi.biBitCount = 24;
    bhi.biCompression = 0;
    bhi.biSizeImage = 0;
    bhi.biXpelsPerMeter = 0;
    bhi.biYpelsPerMeter = 0;
    bhi.biClrUsed = 0;
    bhi.biClrImportant = 0;

  int j;
  GBmp a;
    a.load( w,h, rgb );
    a.rb_swap();
  unsigned char pad[3] = {0};

  FILE *f0 = fopen( spath, "wb" );
    fwrite( &bhi, sizeof(bmp_header_info), 1, f0 );
     for( j=0; j<h; j++ )
     {
     fwrite( &a.rgb[j*w*3], sizeof(unsigned char), w*3, f0 );
     fwrite( pad, sizeof(unsigned char), (4-w*3%4)%4, f0 );
     }
  fclose(f0);
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/7/16 下午 08:19:30
噢... 有一點需要修正, Uncompressed Bitmap 它的 scanline 是 bottom-up ( 由下而上 ), 並不是之前說的 top-down ( 由上而下 )
作者 : bird9527(大鵬鳥)
[ 貼文 84 | 人氣 2245 | 評價 140 | 評價/貼文 1.67 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/9/13 上午 03:42:44
白老鼠大大您好
拜讀您的code讓我學到一些東西
以前讀圖檔是用現成的library
不用去想bmp的head長什麼樣子
更沒有自己寫程式把它讀出來過 @@"
非常感謝呀~~~

我有三個看不懂的地方 :
白老鼠大大若看到這裡,煩請幫忙解答一下...
1.
fwrite( pad, sizeof(unsigned char), (4-w*3%4)%4, f0 );
補零的目的是?


2.
fread( &rgb[j*w*3], sizeof(unsigned char), w*3, f0 );
fseek( f0, (4-w*3%4)%4, SEEK_CUR );
為何要移動檔案指標呢? (對齊嗎 ?????)



3.
(4-w*3%4)%4
用4減掉(超過4倍數的部份)在%4
這樣做的意思是 ?
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/9/13 上午 09:56:49
每一橫線的資料, 以 byte 去算要能被 4 整除, 是 BMP 檔案格式所定義的, 這個的原因, 我其實並不是很清楚, 大概, 是要設合 32 位元 的運算模組的原故吧.

(4-w*3%4)%4, 這個的意思, 是要算出尚欠多少 byte, 每橫線資料才會到達 4 byte 界線.

w*3 <= 以 byte 去算的每橫線資料數目

w*3%4 <= 對於上一個 4 byte 界線, 多出了多少 byte

4-w*3%4 <= 對於下一個 4 byte 界線, 尚差多少 byte. 有一點要注意的, 就是說, 如果每橫線資料數 本來就已 到達 4 byte 界線, 這麼, 我們應該不用作額外的填補, 所以...

(4-w*3%4)%4 <= 值對於 4 時, 修正成 0.

讀寫 也需要處理 4 byte 界線 的情況, 所以 寫的時候可能要作的填補, 讀的時候可能要跳過填補資料.

其實這個寫得是有點草率, 並沒有完全的優化. 例如, 讀入資料時, 應該把所有資料一次過讀入, 然後才再在主記憶體處理 (寫入的考慮也類同). 界線 的計算, 應該在 for loop 之前完成. 計算 界線 的算式, 可以再簡化一點點成 4 * ( ( w*3 + 3 )/4 ) - w*3 ... ...
作者 : bird9527(大鵬鳥)
[ 貼文 84 | 人氣 2245 | 評價 140 | 評價/貼文 1.67 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/9/13 下午 07:02:52
我了解了
3Q 3Q
作者 : m9235104(裕)
[ 貼文 17 | 人氣 2329 | 評價 0 | 評價/貼文 0 | 送出評價 8 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/12/13 下午 02:46:38
你好 ^^

  我用你的方式試了一下 , 發現我在compile時無誤
 
  但是在bulid的時後會有問題

movepicture.obj : error LNK2001: 外部シンボル ""public: __thiscall GBmp::GBmp(void)" (??0GBmp@@QAE@XZ)" は未解決です
movepicture.obj : error LNK2001: 外部シンボル ""public: __thiscall GBmp::~GBmp(void)" (??1GBmp@@QAE@XZ)" は未解決です
movepicture.obj : error LNK2001: 外部シンボル ""public: void __thiscall GBmp::load(char const *)" (?load@GBmp@@QAEXPBD@Z)" は未解決です
Debug/movepicture.exe : fatal error LNK1120: 外部参照 3 が未解決です。
link.exe の実行エラー

請問我要如何處理 , 感激你
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/12/13 下午 04:19:26
這個範例, 包括了三個檔案, 分別是
g_bmp.h , g_bmp.cpp 和 glutTest01.cpp
你需要把這三個檔案的都加入你的專案, 才能夠成功建立程式的, 這三個檔案的內容, 你都可以在這頁找到, 把內容複製一下吧...
作者 : piyang681029(yang)
[ 貼文 16 | 人氣 1279 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/1/13 下午 07:23:30
小弟不才,想請問白老大,在定義typedef struct _bmp_header_info結構之前和之後
的code->#pragma pack(push,1)和#pragma pack(pop,1)
這二行的用意是什麼呢,如果沒寫對程式會不會有所影響呢,麻煩白老大為小弟解答一下
感激不儘!!!
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/1/14 上午 01:02:10
typedef struct _A
{
  char a;
  char b;
  int c;
}A;


上面的自定變數型態, 它的大小看似是 6 bytes, 但是, 對於編譯器的預設設定, 它不是 6 bytes, 而是 8 bytes. 這是出於效能的考慮, 因為用 6 bytes 的話, 存取的效能會比 8 bytes 差很多. 不過, 這樣的優化, 會把指標強制轉型的步驟攪壞了.

上面的 pack, 就是把這個優化關掉的意思.
作者 : computer0176(Eliot)
[ 貼文 16 | 人氣 4667 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/5/10 下午 07:39:55
[Error] GBmp::load, must be RGB888 bitmap
Press any key to continue

請問RGB888 bitmap是?
作者 : computer0176(Eliot)
[ 貼文 16 | 人氣 4667 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/5/10 下午 07:40:04
[Error] GBmp::load, must be RGB888 bitmap
Press any key to continue

請問RGB888 bitmap是?
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/5/10 下午 07:45:17
>請問RGB888 bitmap是?

24 bit 色彩的 BMP
作者 : computer0176(Eliot)
[ 貼文 16 | 人氣 4667 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/5/10 下午 08:08:59
問它倒置的b.bmp為何會全部集中在上層?變成一個長條的圖
跟原來圖完全不像
作者 : da0326(Kyle)
[ 貼文 11 | 人氣 692 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/7/19 下午 01:30:42
請問一下...
這程式存出來的圖是24bit的圖
如果今天我想把他改成存成8bit的灰階圖
我該怎麼改寫呢

我的寫法是這樣的: (可是變成全黑的圖)

    bmp_header_info bhi;
    bhi.bfType = 'MB';
    bhi.bfSize = w*h*1*sizeof(unsigned char) + sizeof(bhi);
    bhi.bfReserved1 = 0;
    bhi.bfReserved2 = 0;
    bhi.bfOffBits = sizeof(bhi);

    bhi.biSize = 40;
    bhi.biWidth = w;
    bhi.biHeight = h;
    bhi.biPlanes = 1;
    bhi.biBitCount = 8;
    bhi.biCompression = 0;
    bhi.biSizeImage = 0;
    bhi.biXpelsPerMeter = 0;
    bhi.biYpelsPerMeter = 0;
    bhi.biClrUsed = 0;
    bhi.biClrImportant = 0;

    int j;
    CBmp a;
    a.load( w,h, rgb );
    //a.rb_swap();
    unsigned char pad[3] = {0};
    
    FILE *f0 = fopen( spath, "wb" );
    fwrite( &bhi, sizeof(bmp_header_info), 1, f0 );
    for( j=0; j<h; j++ )
    {
fwrite( &a.rgb[j*w*1], sizeof(unsigned char), w*1, f0 );
//fwrite( pad, sizeof(unsigned char), (4-w*3%4)%4, f0 );
    }
    fclose(f0);
作者 : yamaha962(電腦繪圖)
[ 貼文 4 | 人氣 677 | 評價 50 | 評價/貼文 12.5 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/9/13 下午 03:43:40
1>------ Build started: Project: 0913pp, Configuration: Debug Win32 ------
1>Compiling...
1>bmp.cpp
1>c:\mfc\0913pp\bmp.cpp(11) : fatal error C1083: Cannot open include file: 'g_bmp.h': No such file or directory
1>Build log was saved at "file://c:\MFC\0913pp\Debug\BuildLog.htm"
1>0913pp - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
這是哪裡錯誤?
作者 : yamaha962(電腦繪圖)
[ 貼文 4 | 人氣 677 | 評價 50 | 評價/貼文 12.5 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/9/13 下午 03:43:52
1>------ Build started: Project: 0913pp, Configuration: Debug Win32 ------
1>Compiling...
1>bmp.cpp
1>c:\mfc\0913pp\bmp.cpp(11) : fatal error C1083: Cannot open include file: 'g_bmp.h': No such file or directory
1>Build log was saved at "file://c:\MFC\0913pp\Debug\BuildLog.htm"
1>0913pp - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
這是哪裡錯誤?
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/18 下午 05:21:16
發現了一個錯誤, 在 g_bmp.cpp 裡, 定義 struct _bmp_header_info 時,
原來的 macro 指令 #pragma pack( pop, 1 ) 是錯誤的,
它應該是 #pragma pack(pop) .

>#pragma pack( push, 1 )
>typedef struct _bmp_header_info
>{
> //...
>} bmp_header_info;
>#pragma pack( pop, 1 ) << 這 macro 指令錯了, 它應改成 #pragma pack(pop)

作者 : nc0918(軒)
[ 貼文 3 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/28 上午 11:32:53
請問一下,我現在利用rgb轉換處理,我最後用矩陣輸出R[0]][i][j]、R[1]][i][j]、R[2]][i][j] 來代表處理完的RGB,現在我要把他存回BMP圖檔,不知要如何存???麻煩教一下,謝謝~~
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/9/28 下午 02:00:02
GBmp 同時有讀寫的功能的, 你只要把你的資料填回去 rgb陣列 裡, 然後呼叫 save() 就成了.
作者 : nc0918(軒)
[ 貼文 3 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/10/5 下午 07:46:35
白老鼠大大謝謝~
上面的解決了,但現在我想要問的是如果我把很多張圖放在一個資料裡,要如何修改直接從資料裡讀出來~謝謝
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/10/6 下午 01:48:43
GBmp 這個 class object, 沒有很全面的功能, 如果你想要取得一張圖裡面的一部份, 你需要自行處理 rgb 陣列.
作者 : nc0918(軒)
[ 貼文 3 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/10/6 下午 02:59:57
謝謝~因為程式讀檔是用ImgA.load("77.bmp")這個,我想說如果改成像ftrain = fopen("train.txt","r");圖片放在這底下,不知大大了解我的意思嗎,不知要如何修改~~謝謝
作者 : xu4510014(荔枝)
[ 貼文 9 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/7/8 下午 02:54:42
大大 請教下 在第一篇文章我使用你的說明成功創建視窗
但是我按照你的說明創建三個檔案來放置程式碼
編譯沒有問題 建置卻出現錯誤

c:\users\rex\documents\visual studio 2010\projects\opengl\opengl\gluttest01.cpp(1): warning C4627: '#include "g_bmp.h"': 尋找先行編譯標頭使用時略過
     新增指示詞到 'StdAfx.h' 或重建先行編譯標頭
c:\users\rex\documents\visual studio 2010\projects\opengl\opengl\gluttest01.cpp(5): error C2065: 'GBmp' : 未宣告的識別項
c:\users\rex\documents\visual studio 2010\projects\opengl\opengl\gluttest01.cpp(5): error C2146: 語法錯誤 : 遺漏 ';' (在識別項 'tbmp' 之前)

不知道是我哪個操作有錯誤?
 板主 : 白老鼠(Gary)
 > OpenGL - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - OpenGL - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
OpenGL
1 白老鼠(Gary) 2720 
2 CROMAYEN2000 1530 
3 aming 500 
4 東昇 380 
5 PLAYER 120 
6 富伯 110 
7 qq 100 
8 NDark 80 
9 ozzy 60 
10 simula 60 
OpenGL
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.171875