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

RGB值取出、轉回影像時怪怪的

尚未結案
howdz
一般會員


發表:17
回覆:12
積分:5
註冊:2003-12-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-13 22:24:38 IP:140.129.xxx.xxx 未訂閱
我把影像每個pixel的RGB值讀入一個三維矩陣, 我再轉回去時故意把 R 值設為0轉換回去,結果發現只做了正方形的範圍 程式: void __fastcall TForm1::Button2Click(TObject *Sender) { Form2->Label1->Visible = false; String file_name; file_name=FileListBox1->FileName; Edit1->Text=file_name; if(file_name != "") Form2->Image1->Picture->LoadFromFile(file_name); Form2->Show(); } //---------------------------------------------------------------------------    void __fastcall TForm1::Button3Click(TObject *Sender) { int height = Form2->Image1->Height; int width = Form2->Image1->Width;     int ***OriMatrix; OriMatrix = new int**[height]; for(int i=0; i<height; i++) { OriMatrix[i] = new int*[width]; for(int j=0; j<width; j++) { OriMatrix[i][j] = new int[3];         } } image_to_array(Form2->Image1,OriMatrix); array_to_image(OriMatrix,Form2->Image1); } //---------------------------------------------------------------------------    //將影像轉換為數值矩陣 void TForm1::image_to_array(TImage * Image, int ***Matrix) { for(int i=0;i<Image->Height;i++) { for(int j=0;j<Image->Width;j++) { Matrix[i][j][0]=GetRValue(Image->Canvas->Pixels[i][j]); Matrix[i][j][1]=GetGValue(Image->Canvas->Pixels[i][j]); Matrix[i][j][2]=GetBValue(Image->Canvas->Pixels[i][j]); } } } //---------------------------------------------------------------------------    //將數值矩陣轉換為影像 void TForm1::array_to_image(int ***Matrix, TImage * Image) { for(int i=0;i<Image->Height;i++) { for(int j=0;j<Image->Width;j++) { Image->Canvas->Pixels[i][j]=TColor(RGB(0,Matrix[i][j][1],Matrix[i][j][2])); } } } //---------------------------------------------------------------------------     請問為何不是處理所有的pixel? p.s.我知道通常處理影像的矩陣是宣告二維的來做, 並不一定要宣告成三維的,但是如果可以的話, 我想維持三維的做法,請問錯誤在哪呢? 發表人 - howdz 於 2005/01/13 23:53:35 發表人 - howdz 於 2005/01/14 00:01:21
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-14 01:14:32 IP:203.204.xxx.xxx 未訂閱
Hi~howdz你紅色的地方錯了i和j顛倒即可或陣列的ij交換
引言: 我把影像每個pixel的RGB值讀入一個三維矩陣, 我再轉回去時故意把 R 值設為0轉換回去,結果發現只做了正方形的範圍 程式: void __fastcall TForm1::Button2Click(TObject *Sender) { Form2->Label1->Visible = false; String file_name; file_name=FileListBox1->FileName; Edit1->Text=file_name; if(file_name != "") Form2->Image1->Picture->LoadFromFile(file_name); Form2->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { int height = Form2->Image1->Height; int width = Form2->Image1->Width; int ***OriMatrix; OriMatrix = new int**[height]; for(int i=0; i<height; i++) { OriMatrix[i] = new int*[width]; for(int j=0; j<width; j++) { OriMatrix[i][j] = new int[3]; } } image_to_array(Form2->Image1,OriMatrix); array_to_image(OriMatrix,Form2->Image1); } //--------------------------------------------------------------------------- //將影像轉換為數值矩陣 void TForm1::image_to_array(TImage * Image, int ***Matrix) { for(int i=0;i<Image->Height;i++) { for(int j=0;j<Image->Width;j++) { Matrix[i][j][0]=GetRValue(Image->Canvas->Pixels[i][j]); Matrix[i][j][1]=GetGValue(Image->Canvas->Pixels[i][j]); Matrix[i][j][2]=GetBValue(Image->Canvas->Pixels[i][j]); } } } //--------------------------------------------------------------------------- //將數值矩陣轉換為影像 void TForm1::array_to_image(int ***Matrix, TImage * Image) { for(int i=0;i<Image->Height;i++) { for(int j=0;j<Image->Width;j++) { Image->Canvas->Pixels[i][j]=TColor(RGB(0,Matrix[i][j][1],Matrix[i][j][2])); } } } //--------------------------------------------------------------------------- 請問為何不是處理所有的pixel? p.s.我知道通常處理影像的矩陣是宣告二維的來做, 並不一定要宣告成三維的,但是如果可以的話, 我想維持三維的做法,請問錯誤在哪呢? 發表人 - howdz 於 2005/01/13 23:53:35 發表人 - howdz 於 2005/01/14 00:01:21
howdz
一般會員


發表:17
回覆:12
積分:5
註冊:2003-12-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-14 01:40:36 IP:61.229.xxx.xxx 未訂閱
引言: Hi~howdz你紅色的地方錯了i和j顛倒即可或陣列的ij交換
我把紅色的地方i改成j,j改成i,結果出現下面的錯誤訊息, 後來我對調了存取影像時的i,j就可以了, 如下面紅色的部分: //將影像轉換為數值矩陣 void TForm1::image_to_array(TImage * Image, int ***Matrix) { for(int i=0;i<Image->Height;i++) { for(int j=0;j<Image->Width;j++) { Matrix[i][j][0]=GetRValue(Image->Canvas->Pixels[j][i]); Matrix[i][j][1]=GetGValue(Image->Canvas->Pixels[j][i]); Matrix[i][j][2]=GetBValue(Image->Canvas->Pixels[j][i]); } } } //--------------------------------------------------------------------------- //將數值矩陣轉換為影像 void TForm1::array_to_image(int ***Matrix, TImage * Image) { for(int i=0;i<Image->Height;i++) { for(int j=0;j<Image->Width;j++) { Image->Canvas->Pixels[j][i]=TColor(RGB(0,Matrix[i][j][1],Matrix[i][j][2])); } } } 謝謝rogan321囉!
系統時間:2024-11-23 5:34:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!