[問題] 新手讀bmp 的每點rgb

看板C_and_CPP作者 (還是朋友?)時間14年前 (2011/08/05 14:57), 編輯推噓0(0037)
留言37則, 7人參與, 最新討論串1/3 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no 問題(Question): 24位元的bmp 因為我用fstream 來寫開讀檔 跟大家用file = =a 不太一樣 所以標頭讀完後 = 口= 我就不知道也怎讀取rgb了 typedef struct bmpinfoheader { unsigned long bmpInfoSize;//Bitmap Info Header 的長度 unsigned long bmpWidth; //寬 unsigned long bmpHeight;//高(長) unsigned short bmpPlanes;//點陣圖的位元圖層數 ;     unsigned short bmpBitPixel;//每個像素的位元數 unsigned long bmpCompression;//壓縮方式 unsigned long bmpDataSize; unsigned long bmpXplan;//x方向 水平 unsigned long bmpYplan;//y 方向 垂直 unsigned long bmpColorUsed;//使用顏色數 unsigned long bmpColorImportant;//重要顏色數 } ; typedef struct RGB { unsigned char b; unsigned char g; unsigned char r; unsigned char reserved; }; int main () { open_file(); system("pause"); } int open_file() { bmpfileheader fhd; bmpinfoheader ihd; RGB color; fstream file ; //宣告fstream物件 file.read((char*)&ihd.bmpColorImportant,4); cout<<"imp color:"<<ihd.bmpColorImportant<<endl; //這是info head 重要顏色 接下來就不會寫讀取RGB了 //有想過 file.read((char*)&color.b,1) 來讀左下第一個b值或改3硬bgr 印出來cout<<"b:"<<color.b<<endl;卻沒東西Q0Q } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.109.77 ※ 編輯: pigcat1315 來自: 114.34.109.77 (08/05 15:01) ※ 編輯: pigcat1315 來自: 114.34.109.77 (08/05 15:02)

08/05 15:02, , 1F
08/05 15:02, 1F

08/05 15:13, , 2F
@_@樓上他那個也適用file寫 我用fstream 可以照樣嗎
08/05 15:13, 2F

08/05 15:20, , 3F
可以
08/05 15:20, 3F

08/05 15:41, , 4F
fgetc() 我的該用麼去換呢?file.get()?
08/05 15:41, 4F

08/05 15:47, , 5F
file.getc()<--他只是改成member function.用法沒變太多
08/05 15:47, 5F

08/05 15:53, , 6F
@_@樓上.getc() 好像沒這 member阿
08/05 15:53, 6F

08/05 15:58, , 7F
http://ppt.cc/rVTn 用法眾多,看一下
08/05 15:58, 7F

08/05 16:05, , 8F
恩@_@我也是在看這個~努力換換看
08/05 16:05, 8F

08/05 16:21, , 9F
Sorry,因為我習慣用getline去讀取.所以沒注意到
08/05 16:21, 9F

08/05 16:41, , 10F
耳且他方法說真的我看不太懂Q0Q
08/05 16:41, 10F

08/05 16:58, , 11F
我以為他寫的算清楚,大多問題都有考慮到。給了解答看
08/05 16:58, 11F

08/05 16:59, , 12F
不懂,似乎..看要直接研究解答,還是復習整個bmp,看你.
08/05 16:59, 12F

08/05 17:10, , 13F
問個笨問題...j的那個for迴圈
08/05 17:10, 13F

08/05 17:11, , 14F
(int j=0 ; j<(4-(biWidth*3)%4); fgetc(fp),j++);
08/05 17:11, 14F

08/05 17:12, , 15F
XD 執行fgetc(fp) 的次數嗎 我沒這樣寫過 哈
08/05 17:12, 15F

08/05 17:13, , 16F
Reads a block of data of n characters and stores it
08/05 17:13, 16F

08/05 17:14, , 17F
這個是read的定義.沒辦法像c的fread這樣,去計算一次要讀
08/05 17:14, 17F

08/05 17:15, , 18F
取多少位元.我自行研究看看好了
08/05 17:15, 18F

08/05 17:17, , 19F
恩 感謝樓上~ 所以我在程式碼有try那個可惜 沒東西
08/05 17:17, 19F

08/05 17:45, , 20F
08/05 17:45, 20F

08/05 17:45, , 21F
參考的網站是 http://0rz.tw/613N9
08/05 17:45, 21F

08/05 17:47, , 22F
基本上你還是要搭配位元運算.只是rgb和位元運算是我的缺
08/05 17:47, 22F

08/05 17:47, , 23F
點,愛莫能助Orz
08/05 17:47, 23F

08/05 17:55, , 24F
位元運算交給 compiler XD (大誤)
08/05 17:55, 24F

08/05 17:57, , 25F
tropical72 可以試試看rgb的梗嘛?
08/05 17:57, 25F

08/05 19:09, , 26F
我其實真的不知道原po是想做到怎樣,因我看他附的程式碼
08/05 19:09, 26F

08/05 19:09, , 27F
大多東西也都出來了,我不懂他卡在哪 XD
08/05 19:09, 27F

08/05 19:10, , 28F
要把 FILE 類 function 改成 fstream object 也不難吧.
08/05 19:10, 28F

08/05 19:14, , 29F
rgb... 用uint32_t 吧~~
08/05 19:14, 29F

08/05 19:33, , 30F
他應該是不知道怎麼湊出一個color吧!
08/05 19:33, 30F

08/05 19:36, , 31F
unsigned char A, R, G, B;
08/05 19:36, 31F

08/05 19:36, , 32F
int color = color = (A<<24) | (R<<16) | (G<<8) | B;
08/05 19:36, 32F

08/05 19:37, , 33F
int color = (A<<24) | (R<<16) | (G<<8) | B;<--這樣
08/05 19:37, 33F

08/05 19:39, , 34F
只是讓我困惑的是get,只讀取n個char,不知道跟fread會混
08/05 19:39, 34F

08/05 19:40, , 35F
淆嘛? 畢竟非我領域.
08/05 19:40, 35F
※ 編輯: pigcat1315 來自: 114.34.109.77 (08/05 23:43) ※ 編輯: pigcat1315 來自: 114.34.109.77 (08/05 23:45)

08/05 23:46, , 36F
std::cout << static_cast<int>(color.b);
08/05 23:46, 36F

08/05 23:47, , 37F
或是你要偷懶用 std::cout << +color.b; 也可以XD
08/05 23:47, 37F
※ 編輯: pigcat1315 來自: 114.34.109.77 (08/06 00:59)
文章代碼(AID): #1EEvHY09 (C_and_CPP)
文章代碼(AID): #1EEvHY09 (C_and_CPP)