精華區beta NTUE-CS99 關於我們 聯絡資訊
※ 引述《yantchen (球童Yanting)》之銘言: : 嗯 : 剛剛試了一下bmp檔 : 果然跟c&cpp版說的一樣 卡在IO 後面就很簡單了 : 先看bmp的格式 : 開小畫家 : http://210.240.185.243/~yanting/test1.jpg
: 畫一個黑白條紋的 存檔 用16進位編輯器開 : 然後再把這張圖拉大 : http://210.240.185.243/~yanting/test2.jpg
: 比對一下內容 : 發現 00000036h 之前的東西 : 應該是 bmp 檔頭資訊 : 00000036h 開始後面就是 三個一組 每個像素的 R G B 值 : 所以不管 檔頭資訊的簡單方法就是 : 把每個像素的 R G B 都變成 舊的 (R+G+B)/3 : 例如本來是 R=255 G=0 B=0 變成 R=85 G=85 B=85 : #include<iostream> : #include<fstream> : using namespace std; : int main() : { : char filename[1024]; : cout<<"請輸入要讀取的彩色bmp圖檔檔名:"; : cin>>filename; : fstream fin(filename,ios::binary|ios::in); : cout<<"請輸入要輸出的黑白bmp圖檔檔名:"; : cin>>filename; : fstream fout(filename,ios::binary|ios::out); : char trash[53]; : fin.read(trash,53); : // 先把前面的53個(0x35)byte 讀出來放到垃圾桶 倒到新的檔案 : fout.write(trash,53); : char color_src[3]; // 讀原來的 : char color_blk[3]; // 放之後的 : while(!fin.eof()) // 每次讀三個byte直到檔案結尾 : { : fin.read(color_src,3); : // 黑白顏色=原本顏色RGB/3 : color_blk[0]=(color_src[0]+color_src[1]+color_src[2])/3; : color_blk[1]=color_blk[0]; : color_blk[2]=color_blk[0]; : fout.write(color_blk,3); : } : } : 嗯 變黑白了 不過看來RGB三個顏色的比例要參考老師上課的比例調一下 : 直接平均轉出來是有黑白 但是怪怪的 : C++ 作業輕輕鬆鬆 XD 上面的程式碼轉出來有些地方會爆掉 ( 因為溢位 ) C++ binary mode 只支援 char 但 char 是 -128 ~ 127 所以假設原本的點的顏色是 255 的話 讀進來會變成 -1 在做運算前要先做點處理 char color_src[3]; // 讀原來的 char color_blk[3]; // 放之後的 int color_tmp[3]; // 暫存 while(!fin.eof()) // 每次讀三個byte直到檔案結尾 { fin.read(color_src,3); for(int i=0;i<3;i++) { color_tmp[i]=color_src[i]; if(color_tmp[i]<0) color_tmp[i]+=256; } color_blk[0]=(color_tmp[0]+color_tmp[1]+color_tmp[2])/3; color_blk[1]=color_blk[0]; color_blk[2]=color_blk[0]; fout.write(color_blk,3); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.68.15.209 ※ 編輯: yantchen 來自: 203.68.15.209 (12/14 21:16)