我把從這個網站上別人寫的讀檔程式去執行結果是可以的
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的問題
謝謝