bcb6
一般會員
發表:4 回覆:5 積分:1 註冊:2004-08-31
發送簡訊給我
|
請問一下 要如何去使用 看了一些範例看不懂 temp->PixelFormat=pf24bit;
int w=temp->Width;
int h=temp->Height;
Byte *ptr;
for (int row=0; rowScanLine[row];//這個步驟有什麼功能
int index=0;
for (int col=0; col
|
richtop
資深會員
發表:122 回覆:646 積分:468 註冊:2003-06-10
發送簡訊給我
|
引言:
temp->PixelFormat=pf24bit; // 將圖形當成每一pixel為(R,G,B)的24-bits全彩影像。
int w=temp->Width; // 取得Bitmap temp 的寬
int h=temp->Height; // 取得Bitmap temp 的高
Byte *ptr; // 宣告指標變數ptr,用以動態指向bitmap某一列資料的起始位址 for (int row=0; rowScanLine[row];//這個步驟有什麼功能 // ptr指向temp的第row列,即每次處理一列影像。
int index=0;
for (int col=0; col1,1=>0,就是取其反相的值(負片效果),也等於ptr[index]= 255- ptr[index],因為兩者的和為255,以8位元來看每個位元都是1。
ptr[index 1]=~ptr[index 1]; // 處理Green分量
ptr[index 2]=~ptr[index 2]; // 處理Red分量
index =3; // 跳三個bytes(BGR),指向下一點。
}
} // 如果您要將其當成二維影像來看的話,底下程式碼與上述程式有相同的結果,請參考。
unsigned char **aryPtr; // 附帶說明:Byte即unsigned char
aryPtr = new unsigned char *[Image2->Picture->Height]; // 動態配置記憶體
for (int y=0; yPicture->Height; y ) // 將每一列的起始位址存入aryPtr陣列
{ aryPtr[y] = (unsigned char*) Image2->Picture->Bitmap->ScanLine[y];
}
for (int y=0; yPicture->Height; y )
{ for (int x=0; xPicture->Width; x )
{ aryPtr[y][3*x ]= 255-aryPtr[y][3*x ];
aryPtr[y][3*x 1]= 255-aryPtr[y][3*x 1];
aryPtr[y][3*x 2]= 255-aryPtr[y][3*x 2];
}
}
delete [] aryPtr; // 釋放記憶體
RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====##### 發表人 - richtop 於 2004/09/07 21:06:29 發表人 - richtop 於 2004/09/07 21:11:14
|
bcb6
一般會員
發表:4 回覆:5 積分:1 註冊:2004-08-31
發送簡訊給我
|
再請問一下: unsigned char **aryPtr; // 附帶說明:Byte即unsigned char
aryPtr = new unsigned char *[Image2->Picture->Height]; // 動態配置記憶體
for (int y=0; yPicture->Height; y ) // 將每一列的起始位址存入aryPtr陣列
{ aryPtr[y] = (unsigned char*) Image2->Picture->Bitmap->ScanLine[y];
/*******************************************************
aryPtr[0]=>指標,指向第一列的值[r1 g1 b1 r2 g2 b2 r3 g3 b3.......]
aryPtr[1]=>指標,指向第二列的值[r1 g1 b1 r2 g2 b2 r3 g3 b3.......]
aryPtr[2]=>指標,指向第三列的值[r1 g1 b1 r2 g2 b2 r3 g3 b3.......]
不知道我這樣的註解是正確的嗎?
************************************************************/ } /******************************************************************
底下是否代表著將陣列中的所有RGB值,全部與255相減做出反相的效果出來
*******************************************************************/
for (int y=0; yPicture->Height; y )
{ for (int x=0; xPicture->Width; x )
{ aryPtr[y][3*x]= 255-aryPtr[y][3*x ];
aryPtr[y][3*x 1]= 255-aryPtr[y][3*x 1];
aryPtr[y][3*x 2]= 255-aryPtr[y][3*x 2];
}
}
delete [] aryPtr; // 釋放記憶體 PS:這個範例是將指標指到圖形的檔案陣列過去,那假如要用一個暫存陣列去儲存呢?
|
richtop
資深會員
發表:122 回覆:646 積分:468 註冊:2003-06-10
發送簡訊給我
|
引言:
再請問一下: unsigned char **aryPtr; // 附帶說明:Byte即unsigned char
aryPtr = new unsigned char *[Image2->Picture->Height]; // 動態配置記憶體
for (int y=0; yPicture->Height; y ) // 將每一列的起始位址存入aryPtr陣列
{ aryPtr[y] = (unsigned char*) Image2->Picture->Bitmap->ScanLine[y];
/*******************************************************
aryPtr[0]=>指標,指向第一列的值[r1 g1 b1 r2 g2 b2 r3 g3 b3.......]
aryPtr[1]=>指標,指向第二列的值[r1 g1 b1 r2 g2 b2 r3 g3 b3.......]
aryPtr[2]=>指標,指向第三列的值[r1 g1 b1 r2 g2 b2 r3 g3 b3.......]
不知道我這樣的註解是正確的嗎?
************************************************************/ 您說的沒錯!但根據測試的結果發現,資料的儲存順序是:[b0 g0 r0 b1 g1 r1 .....]。
} /******************************************************************
底下是否代表著將陣列中的所有RGB值,全部與255相減做出反相的效果出來
*******************************************************************/
for (int y=0; yPicture->Height; y )
{ for (int x=0; xPicture->Width; x )
{ aryPtr[y][3*x]= 255-aryPtr[y][3*x ];
aryPtr[y][3*x 1]= 255-aryPtr[y][3*x 1];
aryPtr[y][3*x 2]= 255-aryPtr[y][3*x 2];
}
}
delete [] aryPtr; // 釋放記憶體 您又說對了! PS:這個範例是將指標指到圖形的檔案陣列過去,那假如要用一個暫存陣列去儲存呢?
不曉得您所謂的暫存陣列是多大的?
如果要將整個影像都存起來的話,就必須動態宣告大小為[image_rows][3*image_columns]的二維陣列。當然也可以用一維陣列去存,大小就是[image_rows*image_columns*3]。例如:
int imageWidth=256, imageHeight=256;
unsigned char *myImage1D, **myImage2D; // 動態記憶體配置
myImage2D = new unsigned char *[imageHeight];
for (int r=0; r 不過您還需要將影像資料copy到該陣列中,這樣似乎又多花了一倍的記憶體去記憶相同的東西,可直接透過ScanLine來完成這個工作。 但如果您又有他用,自又另當別論了。 要是您的影像大小是固定的,就直接在程式中作靜態宣告即可,例如,256x256大小的圖,
unsigned char myImageD[256*256*3],myImage2D[256][256*3];
RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
bcb6
一般會員
發表:4 回覆:5 積分:1 註冊:2004-08-31
發送簡訊給我
|
謝啦 那我知道了 阿問一下如果要儲存到陣列中的話..... 以二維為例子,是不是可以用指標指過去(比如說第一列)然後再從 array[0][0]=arrPtr[0][0]=>B0
array[0][1]=arrPtr[0][1]=>G0
array[0][2]=arrPtr[0][2]=>R0
array[0][3]=arrPtr[0][3]=>B1
array[0][4]=arrPtr[0][4]=>G1
array[0][5]=arrPtr[0][5]=>R1
...........ETC..... 另外,有辦法將RGB三個的值合起來嗎?比如說image->Canvas->pixels[0][0];這是第一個點的像素值,但是以上的方法卻是將R G B分開讀取 儲存的時候也是要分開儲存,在SCANLINE有沒有其他的方法可以使用,我是在想不然就要先將RGB三色的值轉成2進制合起來之後,再轉成10進制去處理可是這樣子好像就比image->Canvas->pixels[0][0]還要慢了點,因為還加上其他的運算。不知道您有什麼高招。
|
richtop
資深會員
發表:122 回覆:646 積分:468 註冊:2003-06-10
發送簡訊給我
|
引言:
謝啦 那我知道了 阿問一下如果要儲存到陣列中的話..... 以二維為例子,是不是可以用指標指過去(比如說第一列)然後再從 array[0][0]=arrPtr[0][0]=>B0
array[0][1]=arrPtr[0][1]=>G0
array[0][2]=arrPtr[0][2]=>R0
array[0][3]=arrPtr[0][3]=>B1
array[0][4]=arrPtr[0][4]=>G1
array[0][5]=arrPtr[0][5]=>R1
...........ETC.....
可以的。 另外,有辦法將RGB三個的值合起來嗎?比如說image->Canvas->pixels[0][0];這是第一個點的像素值,但是以上的方法卻是將R G B分開讀取 儲存的時候也是要分開儲存,在SCANLINE有沒有其他的方法可以使用,我是在想不然就要先將RGB三色的值轉成2進制合起來之後,再轉成10進制去處理可是這樣子好像就比image->Canvas->pixels[0][0]還要慢了點,因為還加上其他的運算。不知道您有什麼高招。
其實pixels[x][y]傳回的資料態是TColor,簡單的說就是您所謂的:將RGB三個的值合起來。
看似RGB三個一起做,不過實際上還是要先拆成RGB分量後再作處理,因此非但沒有比較快反而更慢!您所要找的高招,其實就是您現在用的ScanLine(.)方法。
RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|