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

請問一下各位前輩該怎麼劃直線????

尚未結案
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-16 23:08:28 IP:163.23.xxx.xxx 未訂閱
請問一下前輩們 小弟我現在有一張圖我把它分成三等份,然後在第一等份(由上而下為第一等份第二等份第三等份)我想由上到下,由左到右掃描...遇到pixel=255時就劃由上到下得線,小弟我現在怎麼畫出來的現在第一等份的一開始那邊....不知程式是否可請前輩幫我看看哪裡出錯了...謝謝各位.. 圖案:     程式如下: { Graphics::TBitmap *TheBitmap, *TempBitmap; TempBitmap = new Graphics::TBitmap(); TempBitmap =Image1->Picture->Bitmap; TempBitmap->PixelFormat = pf8bit; Byte *ptr; int w,h,i,j; w=Image1->Width; h=Image1->Height; //unsigned short int piexl[640][480]; int n=0,line; for(int i=0;i<=w;i++) { ptr=(Byte*) TempBitmap->ScanLine[i]; for(int j=0;j<=h/7;j++) { if(ptr[j]==255) n++; } if(n<=2) { line=i; break; } else { n=0; } } Image1->Canvas->Pen->Color=clGreen; Image1->Canvas->Pen->Width=5; Image1->Canvas->Pen->Style=psSolid; Image1->Canvas->MoveTo(line,0); Image1->Canvas->LineTo(line,h/7); }
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-17 17:28:35 IP:221.169.xxx.xxx 未訂閱
你把寬跟高弄反了 ScanLine[]的index是「高」才對,範圍為1~h 你要檢查的pixel的index是「寬」的變化量,範圍為1~w
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-18 16:07:57 IP:61.221.xxx.xxx 未訂閱
各為前輩..我把高跟寬調換,變成以下的圖.......不知道哪裡出問題了 ps:(現在我只在高=h/7,寬=640, 的區域掃描想由左到右,只要遇到pixel=255時我就劃由高等於0到h/7 的直線).....謝謝各為前輩    正在努力學習中的小弟 ....謝謝各位
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-18 19:56:25 IP:221.169.xxx.xxx 未訂閱
你誤會我的意思了    之前的程式碼:
for(int i=0;i<=w;i  )
{
ptr=(Byte*) TempBitmap->ScanLine[i];
for(int j=0;j<=h/7;j  )
{
if(ptr[j]==255)
n  ;
}
...
應該改成
for (int i=0; i<h/7; i  ) //從上而下
{
ptr=(Byte*) TempBitmap->ScanLine[i];
for(int j=0; j
看到差別了嗎? ScanLine[]接受的index是「高度」 取得指標之後ptr[]的index是0~w-1才能取得該行的所有pixel 另外迴圈的範圍要注意一下,要跑完一行所有的pixel index的範圍為0~w-1,而不是0~w 所以要寫成 for(j=0; j
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-18 20:36:00 IP:61.221.xxx.xxx 未訂閱
謝謝各位前輩的指導 但是...我把我的程式改成如下: void __fastcall TForm1::Button3Click(TObject *Sender) { Graphics::TBitmap *TheBitmap, *TempBitmap; TempBitmap = new Graphics::TBitmap(); TempBitmap =Image1->Picture->Bitmap; TempBitmap->PixelFormat = pf8bit; Byte *ptr; int w,h,i,j; w=Image1->Width; h=Image1->Height;  unsigned short int piexl[640][480];  int n=0,line; for (int i=0; iScanLine[i]; for(int j=0; jCanvas->Pen->Color=clWhite; Image1->Canvas->Pen->Width=3; Image1->Canvas->Pen->Style=psSolid; Image1->Canvas->MoveTo(line,0); Image1->Canvas->LineTo(line,h/7); } 結果圖變成如下 不知道哪裡右出錯了......理當應畫在(影像為一個人)鼻子那邊 請各位前輩幫我看看 謝謝你們 正在努裡學習中的小弟
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-18 20:40:03 IP:61.221.xxx.xxx 未訂閱
不好意思 程式迴圈部分放上去不是很明顯.. 我再放一次 void __fastcall TForm1::Button3Click(TObject *Sender) { Graphics::TBitmap *TheBitmap, *TempBitmap; TempBitmap = new Graphics::TBitmap(); TempBitmap =Image1->Picture->Bitmap; TempBitmap->PixelFormat = pf8bit; Byte *ptr; int w,h,i,j; w=Image1->Width; h=Image1->Height;  unsigned short int piexl[640][480];  int n=0,line; for (int i=0; iScanLine[i]; for(int j=0; jCanvas->Pen->Color=clWhite; Image1->Canvas->Pen->Width=3; Image1->Canvas->Pen->Style=psSolid; Image1->Canvas->MoveTo(line,0); Image1->Canvas->LineTo(line,h/7); }
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-18 20:44:51 IP:61.221.xxx.xxx 未訂閱
不知道怎麼了....我放上去的程式不能顯示出來...我已經改成你所提供的方法... 我再放一次 程式如下:void __fastcall TForm1::Button3Click(TObject *Sender) { Graphics::TBitmap *TheBitmap, *TempBitmap; TempBitmap = new Graphics::TBitmap(); TempBitmap =Image1->Picture->Bitmap; TempBitmap->PixelFormat = pf8bit; Byte *ptr; int w,h,i,j; w=Image1->Width; h=Image1->Height;  unsigned short int piexl[640][480];  int n=0,line; for (int i=0;iScanLine[i]; for(int j=0;jCanvas->Pen->Color=clWhite; Image1->Canvas->Pen->Width=3; Image1->Canvas->Pen->Style=psSolid; Image1->Canvas->MoveTo(line,0); Image1->Canvas->LineTo(line,h/7); } 不好意思 ....謝謝.....
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-18 22:27:41 IP:221.169.xxx.xxx 未訂閱
有關程式碼亂掉的問題,請搜尋一下本版的「版規」,裡面有說明    至於程式的部份,我編譯執行了一下,發現問題出在變數的scope 你在處理迴圈之外定義了i,j變數 然而在迴圈裡面,也分別定義了i,j變數 當j迴圈跑完後,這一個迴圈內的變數j已經失去作用了 因此line=j;這一行其實取到的j變數值是迴圈外的j值 這個值是沒有定義的,所以line得到的值根本是錯的    另一個問題在於j迴圈跑完之後,j會等於w+1 這個並不是你想要的東西吧? 所以應該在檢查到有255的點存在的時候,就要中斷j迴圈,同時把這個值記錄下來    第三個問題,你有new了一個空間給予TempBitmap 但下一行你又馬上指定TempBitmap =Image1->Picture->Bitmap; 也就是指定Image1->Picture->Bitmap給予TempBitmap 發現問題在哪兒了嗎? 第一個:你new的那個空間失去了指標,會發生記憶體洩漏 第二個:接下來呼叫的TempBitmap->PixelFormat = pf8bit; 等同於呼叫Image1->Picture->Bitmap->PixelFormat = pf8bit; 會修改到原圖的影像格式 正確的指令應該是Assign()    修改後的code如下:
{
Graphics::TBitmap *TheBitmap, *TempBitmap;
TempBitmap = new Graphics::TBitmap;
TempBitmap->Assign(Image1->Picture->Bitmap);
TempBitmap->PixelFormat = pf8bit;
Byte *ptr;
int w,h,i,j;
w=Image1->Width;
h=Image1->Height;
int n=0,line=-1;    for(i=0;iScanLine[i];
  for(j=0;jCanvas->Pen->Color=clGreen;
Image1->Canvas->Pen->Width=5;
Image1->Canvas->Pen->Style=psSolid;
Image1->Canvas->MoveTo(line,0);
Image1->Canvas->LineTo(line,h/7);
}
}    
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-18 23:03:57 IP:163.23.xxx.xxx 未訂閱
好感動喔......我終於把它弄懂了 非常謝謝回應我的這位前輩 ............謝謝
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-18 23:07:02 IP:163.23.xxx.xxx 未訂閱
好感動喔......我終於把它弄懂了    非常謝謝回應我的這位前輩    ............謝謝    我把最終的圖放上去..... 請前輩看看是不是這樣.. 謝謝....
系統時間:2024-11-25 22:42:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!