請問一下各位前輩該怎麼劃直線???? |
尚未結案
|
小慶
一般會員 發表:45 回覆:31 積分:15 註冊:2004-09-29 發送簡訊給我 |
請問一下前輩們
小弟我現在有一張圖我把它分成三等份,然後在第一等份(由上而下為第一等份第二等份第三等份)我想由上到下,由左到右掃描...遇到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 發送簡訊給我 |
|
小慶
一般會員 發表:45 回覆:31 積分:15 註冊:2004-09-29 發送簡訊給我 |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
你誤會我的意思了 之前的程式碼:
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 發送簡訊給我 |
謝謝各位前輩的指導
但是...我把我的程式改成如下:
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; i
|
小慶
一般會員 發表:45 回覆:31 積分:15 註冊:2004-09-29 發送簡訊給我 |
不好意思
程式迴圈部分放上去不是很明顯..
我再放一次
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; i
|
小慶
一般會員 發表:45 回覆:31 積分:15 註冊:2004-09-29 發送簡訊給我 |
不知道怎麼了....我放上去的程式不能顯示出來...我已經改成你所提供的方法...
我再放一次
程式如下: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;i
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
有關程式碼亂掉的問題,請搜尋一下本版的「版規」,裡面有說明 至於程式的部份,我編譯執行了一下,發現問題出在變數的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;i |
小慶
一般會員 發表:45 回覆:31 積分:15 註冊:2004-09-29 發送簡訊給我 |
|
小慶
一般會員 發表:45 回覆:31 積分:15 註冊:2004-09-29 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |