作者yantchen (球童Yanting)
站內NTUE-CS99
標題Re: [課業] 影像處理作業...C的那個
時間Sun Dec 14 21:16:08 2008
※ 引述《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)