線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:733
推到 Plurk!
推到 Facebook!

想問一個關於bmp讀檔的問題

尚未結案
ccln100
一般會員


發表:3
回覆:0
積分:0
註冊:2004-09-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-25 14:59:50 IP:140.116.xxx.xxx 未訂閱
我把從這個網站上別人寫的讀檔程式去執行結果是可以的   int i,j; Byte *ptr;    Graphics::TBitmap *Bmp1=new Graphics::TBitmap(); Bmp1->Assign(Image1->Picture->Bitmap); Bmp1->PixelFormat=pf24bit; Graphics::TBitmap *Bmp2=new Graphics::TBitmap(); Bmp2->PixelFormat=Bmp1->PixelFormat; Bmp2->Height=Bmp1->Height; Bmp2->Width=Bmp1->Width;    float r[width][height],g[width][height],b[width][height];   //取得RGB static double l[width][height],m[width][height],s[width][height];   //取得lms static double L[width][height],M[width][height],S[width][height];   //取得LMS static double A[width][height],B[width][height],C[width][height];   //取得lab    static double L2[width][height],M2[width][height],S2[width][height];   //回復取得LMS static double l2[width][height],m2[width][height],s2[width][height];   //回復取得lms static double r2[width][height],g2[width][height],b2[width][height];   //回復取得RGB Byte r3[width][height],g3[width][height],b3[width][height];            //轉換RGB為Byte型態    for(j=0;jHeight-1;j ) { for(i=0;iWidth-1;i ) { r[j][i]=GetRValue(Bmp1->Canvas->Pixels[i][j]); g[j][i]=GetGValue(Bmp1->Canvas->Pixels[i][j]); b[j][i]=GetBValue(Bmp1->Canvas->Pixels[i][j]); if(r[j][i]==0 && g[j][i]==0 && b[j][i]==0) {r[j][i]=0.003922;g[j][i]=0.003922;b[j][i]=0.003922;} l[j][i]=(0.3811*r[j][i]/255) (0.5783*g[j][i]/255) (0.0402*b[j][i]/255); m[j][i]=(0.1967*r[j][i]/255) (0.7244*g[j][i]/255) (0.0782*b[j][i]/255); s[j][i]=(0.0241*r[j][i]/255) (0.1288*g[j][i]/255) (0.8444*b[j][i]/255); L[j][i]=log10(l[j][i]); M[j][i]=log10(m[j][i]); S[j][i]=log10(s[j][i]); A[j][i]=(1/sqrt(3)*L[j][i]) (1/sqrt(3)*M[j][i]) (1/sqrt(3)*S[j][i]); B[j][i]=(1/sqrt(6)*L[j][i]) (1/sqrt(6)*M[j][i]) (-2/sqrt(6)*S[j][i]); C[j][i]=(1/sqrt(2)*L[j][i]) (-1/sqrt(2)*M[j][i]); L2[j][i]=(sqrt(3)/3*A[j][i]) (sqrt(6)/6*B[j][i]) (sqrt(2)/2*C[j][i]); M2[j][i]=(sqrt(3)/3*A[j][i]) (sqrt(6)/6*B[j][i]) (sqrt(2)/-2*C[j][i]); S2[j][i]=(sqrt(3)/3*A[j][i]) (sqrt(6)/-3*B[j][i]); l2[j][i]=pow(10,L2[j][i]); m2[j][i]=pow(10,M2[j][i]); s2[j][i]=pow(10,S2[j][i]); r2[j][i]=(4.4679*l2[j][i]*255) ((-3.5873)*m2[j][i]*255) (0.1193*s2[j][i]*255); if(r2[j][i]>255) r2[j][i]=255; if(r2[j][i]<0) r2[j][i]=0; r3[j][i]=(Byte)r2[j][i]; g2[j][i]=((-1.2186)*l2[j][i]*255) (2.3809*m2[j][i]*255) ((-0.1624)*s2[j][i]*255); if(g2[j][i]>255) g2[j][i]=255; if(g2[j][i]<0) g2[j][i]=0; g3[j][i]=(Byte)g2[j][i]; b2[j][i]=(0.0497*l2[j][i]*255) ((-0.2439)*m2[j][i]*255) (1.2045*s2[j][i]*255); if(b2[j][i]>255) b2[j][i]=255; if(b2[j][i]<0) b2[j][i]=0; b3[j][i]=(Byte)b2[j][i]; } } for(j=0;jHeight;j ) //RGB矩陣轉影像 { ptr=(Byte *)Bmp2->ScanLine[j]; int index=0; for(i=0;iWidth;i ) { ptr[index]=b3[j][i]; ptr[index 1]=g3[j][i]; ptr[index 2]=r3[j][i]; index=index 3; } } Image2->Picture->Assign(Bmp2); delete Bmp1; delete Bmp2; } 但我發現當我把程式作更改時發現了一些問題 第一是關於我載入一個較大的檔案時例如512*512 就會發生 stack overflow 的視窗跳出 第二是關於當我把矩陣的資料型態從double 改成int時 就會發生 log10 sign error的問題 謝謝
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-25 15:52:17 IP:221.169.xxx.xxx 未訂閱
ccln100:你的Height及Width都是由Image載入而來,檢查一下你的 Image的Autosize設定或Stretch設定。 第二是關於當我把矩陣的資料型態從double 改成int時 就會發生 log10 sign error的問題 你為何要改變資料型態? 請參考! Andy Chang
------
Andy Chang
系統時間:2024-05-19 5:34:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!