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

有關於scanline的問題

尚未結案
bcb6
一般會員


發表:4
回覆:5
積分:1
註冊:2004-08-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-07 17:06:48 IP:140.116.xxx.xxx 未訂閱
請問一下     要如何去使用    看了一些範例看不懂            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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-07 20:57:55 IP:211.76.xxx.xxx 未訂閱
引言:
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-08 11:29:05 IP:140.116.xxx.xxx 未訂閱
再請問一下:      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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-08 18:17:22 IP:211.76.xxx.xxx 未訂閱
引言: 再請問一下: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-08 18:51:48 IP:140.116.xxx.xxx 未訂閱
謝啦 那我知道了 阿問一下如果要儲存到陣列中的話..... 以二維為例子,是不是可以用指標指過去(比如說第一列)然後再從 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-08 21:08:55 IP:211.76.xxx.xxx 未訂閱
引言: 謝啦 那我知道了 阿問一下如果要儲存到陣列中的話..... 以二維為例子,是不是可以用指標指過去(比如說第一列)然後再從 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 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
系統時間:2024-06-28 2:11:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!