請問:pgm 與 圖形pixel 的問題 |
尚未結案
|
cowbjt
一般會員 發表:11 回覆:30 積分:8 註冊:2004-07-16 發送簡訊給我 |
抱歉,問題有點複雜
問題大概可以分成二個 第一個:
要改pgm圖形的pixel 可以直接修改嗎?
我利用以下程式畫一條將近白色線
for (int i = 10; i <= 200; i ) Image1->Canvas->Pixels[i][10] = 250;但呈現出來的卻是一條滿黑的線 所以請問一下,pgm 是種灰階的圖形格式 但他的rage 是否不在0~255內 ps.後來我將用Pixels[i][10]存在一個陣列 然後,原封不動的再寫回去,呈現的結果是原圖,但變暗了許多??? 怎麼會這樣?? 第二個: 考慮到上述目題,故利用Image圖形讀進來之後 使用 Image1->Picture->SaveToFile("c:\\a.bmp"); 另存為bmp檔,再讀進來,且格式為 Image1->Picture->Bitmap->PixelFormat=pf8bit; 同樣利用上面的畫線程式,但還是一樣的不是一條白線 後來試圖利用下程式畫線 BYTE *ptr = (Byte*)Image1->Picture->Bitmap->ScanLine[50]; for (int i = 0; i <= 100; i ) { ptr[i] = 250; }但卻沒有直線的出現?? 而最後,利用ScanLine畫白線的方法可以成功 但,其成功的條件是,在畫完之後必須有類似 Image1->Canvas->Pixels[0][0] = 200; 的指令去使ScanLine的成果出現 這樣說不知道前輩懂不懂 發表人 - cowbjt 於 2005/04/24 00:05:51 |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
cowbjt
一般會員 發表:11 回覆:30 積分:8 註冊:2004-07-16 發送簡訊給我 |
您好:
這樣講好了
我在Iamge1 裡放了一張pgm 的圖片 然後利用下面code 畫了二條線
for (int i = 10; i <= 200; i ) Image1->Canvas->Pixels[i][10] = 250; BYTE *ptr = (Byte*)Image1->Picture->Bitmap->ScanLine[50]; for (int i = 0; i <= 100; i ) { ptr[i] = 250; }結果 這二條線應該是一樣的顏色吧 可是...居然那麼多 而且,一定要有 Image1->Canvas->Pixels[][] = ; 去設定到(設定那一點,或多少值都無所謂),不然用ptr 畫的線會看不到 不知道這樣有沒有比較清楚一點 |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 您好: 這樣講好了 我在Iamge1 裡放了一張pgm 的圖片 然後利用下面code 畫了二條線cowbjt你好:for (int i = 10; i <= 200; i ) Image1->Canvas->Pixels[i][10] = 250; BYTE *ptr = (Byte*)Image1->Picture->Bitmap->ScanLine[50]; for (int i = 0; i <= 100; i ) { ptr[i] = 250; }結果 這二條線應該是一樣的顏色吧 可是...居然那麼多 而且,一定要有 Image1->Canvas->Pixels[][] = ; 去設定到(設定那一點,或多少值都無所謂),不然用ptr 畫的線會看不到 不知道這樣有沒有比較清楚一點 假設影像的pixel format是24bits 這樣是畫一點,每點3 bytes,總共畫了191點 Image1->Canvas->Pixels[i][10] = 250; 這樣只畫了1/3點, 每次1個byte, 畫了三次才等於上面的一點, 所以100/3,只畫 了34點 ptr[i] = 250; 依照不同的pixel format,這兩種方式畫出來的結果都會不同。 如果你希望上下一樣,則在用scanline的時候,記得一次畫三點 因為 Image1->Canvas->Pixels[i][10] = (TColor)RGB(ptr[i],ptr[i 1], ptr[i 2]) i =3; |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
樓上的JerryKuo大大:
Image1->Canvas->Pixels[i][10] = 250;
的確是以單一個點填入資料的,並非你所謂的1/3個點
使用ScanLine才會有這樣的情況出現 問題在於Image1->Canvas->Pixels[x][y]輸入資料的型態為TColor
當指定250這個值給TColor型態,我們並不知道他會怎麼解釋...
正確的指定方式應該為 Image1->Canvas->Pixels[i][10]=RGB(250,250,250); 但對於我的程式來說,Image1->Canvas->Pixels[i][10] = 250;畫出的是紅線
怎麼跟cowbjt不一樣? 另外,我測試的結果,Pixels跟ScanLine併用並不會產生你所說的情況
我猜可能是
for (int i = 10; i <= 200; i )
Image1->Canvas->Pixels[i][10] = 250;
這個迴圈的i值超過影像的寬度,造成記憶體錯亂
我查看了一下測試影像,其寬度也不過100而已,
結果上述迴圈卻用到200,明顯有問題
|
cowbjt
一般會員 發表:11 回覆:30 積分:8 註冊:2004-07-16 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 樓上的JerryKuo大大: Image1->Canvas->Pixels[i][10] = 250; 的確是以單一個點填入資料的,並非你所謂的1/3個點 使用ScanLine才會有這樣的情況出現 啊>"<,被抓包 可能閱讀方法不同吧!! 這樣是畫一點,每點3 bytes,總共畫了191點 Image1->Canvas->Pixels[i][10] = 250; 這樣讀,應該就跟你說的一樣吧 問題在於Image1->Canvas->Pixels[x][y]輸入資料的型態為TColor 當指定250這個值給TColor型態,我們並不知道他會怎麼解釋... 正確的指定方式應該為 Image1->Canvas->Pixels[i][10]=RGB(250,250,250); 但對於我的程式來說,Image1->Canvas->Pixels[i][10] = 250;畫出的是紅線 怎麼跟cowbjt不一樣? 另外,我測試的結果,Pixels跟ScanLine併用並不會產生你所說的情況 我猜可能是 for (int i = 10; i <= 200; i ) Image1->Canvas->Pixels[i][10] = 250; 這個迴圈的i值超過影像的寬度,造成記憶體錯亂 我查看了一下測試影像,其寬度也不過100而已, 結果上述迴圈卻用到200,明顯有問題 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |