全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2413
推到 Plurk!
推到 Facebook!

取出BMP調色盤

尚未結案
holyduck
一般會員


發表:11
回覆:14
積分:5
註冊:2005-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-08 03:49:01 IP:218.165.xxx.xxx 未訂閱
我用C語言讀一個bmp的圖檔 讀檔和存檔各四個步驟: 讀bitmapfileheader 讀bitmapinfoheader 讀palette 讀image file,然後再依序存入 我宣告了兩個header的struct分別為 struct bitmapfileheader和struct bitmapinfoheader 還有unsigned char f來存放影像資料 這三項我都可以正確無誤的用fread讀出並且用fwrite寫入新檔 (f我是用fseek移到檔案位置再寫入) 可是調色盤我不管怎麼讀怎麼放都不對,所以圖顯示就不正確囉 請問有人有辦法讀調色盤和寫入嗎?? 謝謝
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-08 08:46:23 IP:61.228.xxx.xxx 未訂閱
可以把你顯示圖的方式的CODE貼上來嗎?
holyduck
一般會員


發表:11
回覆:14
積分:5
註冊:2005-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-08 11:51:05 IP:218.165.xxx.xxx 未訂閱
    struct BmpFileHeader
{
 省略          
};    struct BmpInfoHeader
{
 省略;
};    struct BmpFileHeader bmp_fh;
struct BmpInfoHeader bmp_ih;    void bmp_read()
{
 int i,j,psize=2;//psize=調色盤大小
 int bitcount;
 fp=fopen("Lena128.bmp","r");
 bitcount=bmp_ih.bibitcount;
 for(i=0;i    恩~這是我最新的code
fwrite(palette,psize,1,fp1);
指標一直出問題~搞不懂~~>"<~~     
        
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-08 12:30:18 IP:61.228.xxx.xxx 未訂閱
fwrite(palette,psize,1,fp1); bmp_write的函式中看不到你有給palette一個正確的指標.
holyduck
一般會員


發表:11
回覆:14
積分:5
註冊:2005-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-08 22:12:13 IP:220.143.xxx.xxx 未訂閱
這裡也搞不定~~ 我f跟palette宣告方式為 unsigned char *f;*palette;
holyduck
一般會員


發表:11
回覆:14
積分:5
註冊:2005-06-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-10 03:39:15 IP:218.165.xxx.xxx 未訂閱
#include 
#include     void bmp_read(void);
void bmp_write(void);
struct BmpFileHeader
{
 unsigned char  bfType[2];
 unsigned long  bfSize;//影像檔的大小
 unsigned short bfReserved1;
 unsigned short bfReserved2;
 unsigned long  bfOffbits;//影像資料的起始位置
};    struct BmpInfoHeader
{
 unsigned long  bisize;//=40 BITMAPINFOHEADER大小
 unsigned long  biwidth;
 unsigned long  biheight;
 unsigned short biplanes;
 unsigned short bibitcount;
 unsigned long  bicompression;
 unsigned long  bisizeimage;//biWidth * biHeight
 unsigned long  bixpelspermeter;
 unsigned long  biypelspermeter;
 unsigned long  biclrused;//實際的顏色數
 unsigned long  biclrimportant;
};    //global variable//
FILE *fp,*fp1;
unsigned char *f,*g,*palette;
int w,h;
int i,j;
//***************//    struct BmpFileHeader bmp_fh;
struct BmpInfoHeader bmp_ih;    void main(void)
{
 bmp_read();
 bmp_write();
}    void bmp_read(void)
{
 //int psize=2;
 int bitcount;
 int all;//兩個header 調色盤的大小
 fp=fopen("Lena128.bmp","r ");//open file     fread(&bmp_fh,sizeof(struct BmpFileHeader),1,fp);
 fread(&bmp_ih,sizeof(struct BmpInfoHeader),1,fp);     w=bmp_ih.biwidth;
 h=bmp_ih.biheight;
 all=bmp_fh.bfSize-bmp_ih.bisizeimage;     palette=(unsigned char *)malloc(all);
 f=(unsigned char *)malloc(w*h);     fseek(fp,0,SEEK_SET);
 fread(palette,all,1,fp);
 fseek(fp,bmp_fh.bfOffbits,SEEK_SET);
 fread(f,w*h,1,fp);
 //getchar();
}    void bmp_write(void)
{
 int all;
 fp1=fopen("LenaOri.bmp","w ");//open file
 all=bmp_fh.bfSize-bmp_ih.bisizeimage;
 fwrite(&bmp_fh,sizeof(struct BmpFileHeader),1,fp);
 fwrite(&bmp_ih,sizeof(struct BmpInfoHeader),1,fp);
 //fseek(fp1,0,SEEK_SET);
 fwrite(palette,all,1,fp1);
 fseek(fp1,bmp_fh.bfOffbits,SEEK_SET);
 fwrite(f,w*h,1,fp1);
}    
這是我最新修改的~~ 我將兩個header跟palette一起讀~~ 調色盤依然有問題~~>"<~~ 請問有沒有人看的出哪裡有問題~~
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-11 10:13:24 IP:61.228.xxx.xxx 未訂閱
你可否檢查一下,你的BmpFileHeader的結構大小,你可以在bmp_read內加入一行 printf("%d",sizeof(BmpFileHeader));然後看一下顯示出來的數字,如果為14就是正確的,如果為16就是錯誤. 如果為16,你可以在程式前端加入#pragma pack(1)來修正資料結構對齊的問題,不然你所讀進的資料都會是錯誤的.
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-13 17:49:29 IP:140.114.xxx.xxx 未訂閱
引言: 你可否檢查一下,你的BmpFileHeader的結構大小,你可以在bmp_read內加入一行 printf("%d",sizeof(BmpFileHeader));然後看一下顯示出來的數字,如果為14就是正確的,如果為16就是錯誤. 如果為16,你可以在程式前端加入#pragma pack(1)來修正資料結構對齊的問題,不然你所讀進的資料都會是錯誤的.
原來可以這樣@@! 我之前在讀時 就有發現 unsigned char 改用 int 代替時會出現錯誤 明明struct size=14 卻變成16 (當然 我測試時printf出來的結果也因此是錯的) 最後只要用那招= =" (也算是學習的附加收入) unsigned char bfOFFSET[4]; 要怎麼讀成int呢..... 就用 int Reg; memcpy(&Reg, bfOFFSET, sizeof(int) ); 這樣執行後 Reg就是bfOFFSET[4] 的int讀法摟^^ 如果問我為啥要這麼做 是因為我想輕鬆讀出biWIDTH biHEIGHT biSIZE=口=
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
holyduck
一般會員


發表:11
回覆:14
積分:5
註冊:2005-06-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-14 19:10:13 IP:218.165.xxx.xxx 未訂閱
阿~忘記跟大家說~ 用BCB的話~ 工具列的Project->Operation->Advanced Compiler->Data alignment 要把選項改成Byte或是Word 用Quad word的話會一次以四個Byte為單位來讀取~ 所以會讀到16個 至於我的是14個沒錯 用UltreEdit看~ 我的Header都沒問題~ 但是到了調色盤就會出錯~~ 會有一組值是重複的~~ 但是調色盤的大小是正確的 很神奇的現象說~~>"<~~ 現在可以秀圖~可是明明就是灰階的圖卻會有色彩出現~~>"<~~ 發表人 - holyduck 於 2005/07/14 19:15:45
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-15 09:20:02 IP:61.228.xxx.xxx 未訂閱
不是資料結構的問題,那你的問題應該是出在all這個變數,依照你的作法,你給all的值應該是palette的大小,不因該含header的大小,所以應該還要再減去header的大小(54byte),才是正確的值.
holyduck
一般會員


發表:11
回覆:14
積分:5
註冊:2005-06-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-06 22:45:14 IP:218.165.xxx.xxx 未訂閱
找到答案了 fp1=fopen("LenaOri.bmp","w ");//open file 不能用w ~~要用wb
系統時間:2024-05-16 16:26:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!