全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4522
推到 Plurk!
推到 Facebook!

FireMonkey2 圖片處理不完全

答題得分者是:aftcast
炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-02-13 15:12:02 IP:220.134.xxx.xxx 訂閱
各位大大新年快樂~
最近突然想玩玩 C Builder XE3 的 FireMonkey 2,但是遇到了些怪怪的問題

載入圖片然後對圖片做些處理,像是灰階、二值化等等東西
以灰階為例,大圖片(如1152*864)處理上完全沒問題...
但是如果換成小一點的圖片(如300*200)就會發生下半部沒有處理完...

灰階程式碼為...

[code cpp]
int gray = 0, i = 0;
PAlphaColorRecArray ptr;
TBitmapData mBitmapData;

if(OpenDialog1->Execute())
{
Image1->Bitmap->LoadFromFile(OpenDialog1->FileName);

TBitmap *temp = new TBitmap(Image1->Bitmap->Width,Image1->Bitmap->Height);
temp->LoadFromFile(OpenDialog1->FileName);

temp->Map(TMapAccess::maReadWrite, mBitmapData);
ptr = PAlphaColorRecArray(mBitmapData.Data);

for(i = 0; i < temp->Width * temp->Height; i )
{
gray = 0.299*(*ptr)[i].R 0.587*(*ptr)[i].G 0.114*(*ptr)[i].B;
(*ptr)[i].R = (*ptr)[i].G = (*ptr)[i].B = (byte) gray;
}

temp->Unmap(mBitmapData);
Image2->Bitmap = temp;
delete temp;
}
[/code]

不僅灰階有問題...二值化、Sobel 啥的都會發生這問題
測試時有使用 SaveToFile 把處理後的圖片存下來
大圖確定底下都有處理完全! 並不是因為 Stretch 的關係而沒看到 ...

請大大們幫忙看看這是什麼問題吧,在此先感謝大大們

編輯記錄
炎峰 重新編輯於 2013-02-13 00:12:36, 註解 無‧
炎峰 重新編輯於 2013-02-13 00:13:16, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-02-13 15:52:17 IP:114.24.xxx.xxx 訂閱
 HELLO,

你附的小圖的高是225,並非200。所以,應該是你的高度設定與實際的高不合所致。於是25pixel高的區塊並沒有處理到!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-02-14 00:29:14 IP:220.134.xxx.xxx 訂閱
感謝大大回答 

不過...小弟height、width經過中斷點查看是原圖時的大小...

原本也有懷疑過,但是利用中斷去看取得的height和width都和原圖一樣(我是用 Image1->Bitmap 裡面的 height/width)
且因為是 array,所以for裡面用 height*width 沒錯 ...... 吧 ?! ?!

剛剛測試發現不一定是大小圖才會出現這問題
兩張同樣960*720、24色深的照片(JPG)也會有一張處理完全一張不完全的情形出現
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-02-15 01:41:00 IP:114.42.xxx.xxx 訂閱
嗯,那我進一步的猜測是

Image2->Bitmap->Assign(temp);

抱歉,我沒很用力的去測與看。僅把可能性提示而已! 可以試看看再說…

===================引 用 炎峰 文 章===================
感謝大大回答

不過...小弟height、width經過中斷點查看是原圖時的大小...

原本也有懷疑過,但是利用中斷去看取得的height和width都和原圖一樣(我是用 Image1->Bitmap 裡面的 height/width)
且因為是 array,所以for裡面用 height*width 沒錯 ...... 吧 ?! ?!

剛剛測試發現不一定是大小圖才會出現這問題
兩張同樣960*720、24色深的照片(JPG)也會有一張處理完全一張不完全的情形出現
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-02-15 18:02:17 IP:220.134.xxx.xxx 訂閱
感謝 aftcast 大大 

經過測試... 用 Assign 還是不行
在 VCL 上都沒這問題,就唯獨轉到 FM2 有...
不知道是哪邊沒有注意到


===================引 用 aftcast 文 章===================
嗯,那我進一步的猜測是

Image2->Bitmap->Assign(temp);

抱歉,我沒很用力的去測與看。僅把可能性提示而已! 可以試看看再說…

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-02-16 08:40:28 IP:60.245.xxx.xxx 訂閱
嗯,我又再次看了又看,實在想不出有什麼可能性… 加上xe3與xe2的作法完全不同了,且xe3的文件講關於你這個的相關事項極少。

要不你把專案檔與正常與不正常的圖一起zip上來,我在我這裡debug,這樣比較好找出實際問題在哪裡! (你是xe3,對吧?!)

===================引 用 炎峰 文 章===================
感謝 aftcast 大大

經過測試... 用 Assign 還是不行
在 VCL 上都沒這問題,就唯獨轉到 FM2 有...
不知道是哪邊沒有注意到


===================引 用 aftcast 文 章===================
嗯,那我進一步的猜測是

Image2->Bitmap->Assign(temp);

抱歉,我沒很用力的去測與看。僅把可能性提示而已! 可以試看看再說…

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-02-16 09:27:29 IP:114.44.xxx.xxx 訂閱
Hello,

我剛用你附加檔上的「小圖」配合你的程式碼,我這邊show很正常,沒有處理不完的情形。喔,對了,我只改了assign,不過不改好像也正常。(我會改是因為光等號理論上應該是沒有copy上去,只是"指"上去,加上你後面有delete,恐會指向錯的,故還是「正統一點的」用assign。

所以,是你版本與我不同? 我剛用xe3,update2的環境測的。

===================引 用 aftcast 文 章===================
嗯,我又再次看了又看,實在想不出有什麼可能性… 加上xe3與xe2的作法完全不同了,且xe3的文件講關於你這個的相關事項極少。

要不你把專案檔與正常與不正常的圖一起zip上來,我在我這裡debug,這樣比較好找出實際問題在哪裡! (你是xe3,對吧?!)

===================引 用 炎峰 文 章===================
感謝 aftcast 大大

經過測試... 用 Assign 還是不行
在 VCL 上都沒這問題,就唯獨轉到 FM2 有...
不知道是哪邊沒有注意到


===================引 用 aftcast 文 章===================
嗯,那我進一步的猜測是

Image2->Bitmap->Assign(temp);

抱歉,我沒很用力的去測與看。僅把可能性提示而已! 可以試看看再說…

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2013-02-16 10:09:33 IP:114.44.xxx.xxx 訂閱
附我的程式碼:


[code cpp]
PAlphaColorRecArray ptr;
TBitmapData mBitmapData;

if (OpenDialog1->Execute()) {
TBitmap *temp = new TBitmap(OpenDialog1->FileName); // 與你不同
Image1->Bitmap->Assign(temp); // 與你不同,以上是考量效能

temp->Map(TMapAccess::maReadWrite, mBitmapData);
ptr = PAlphaColorRecArray(mBitmapData.Data);

for (int i=0, gray =0; i < temp->Width * temp->Height; i ) {
gray = 0.299 * (*ptr)[i].R 0.587 * (*ptr)[i].G 0.114 * (*ptr)[i].B;
(*ptr)[i].R = (*ptr)[i].G = (*ptr)[i].B = (byte) gray;
(*ptr)[i].A = 0xFF; // 0x80 這裡alpha 測好玩的
}

temp->Unmap(mBitmapData);
Image2->Bitmap->Assign(temp);
delete temp;
}

[/code]

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2013-02-15 19:10:20, 註解 無‧
aftcast 重新編輯於 2013-02-15 19:11:05, 註解 無‧
aftcast 重新編輯於 2013-02-15 19:12:03, 註解 無‧
aftcast 重新編輯於 2013-02-15 19:13:49, 註解 無‧
aftcast 重新編輯於 2013-02-15 19:15:01, 註解 無‧
aftcast 重新編輯於 2013-02-15 19:26:15, 註解 無‧
aftcast 重新編輯於 2013-02-15 19:28:46, 註解 太機車了,似乎 ie 才可以正確的貼上 code!! 害我在chrome一直搞,一直重編‧
炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2013-02-16 13:03:24 IP:220.134.xxx.xxx 訂閱
小弟用您的程式碼測試......還是不行 


不過...小弟去另一台電腦測試卻不會出現這問題 冏rz
不管是您的版本還是小弟的(整個專案複製過去)都不會有這問題
所以...目前看來是我這邊 C Builder 程式有問題

小弟沒想到竟然會是程式上的問題,沒有查清楚就跑來發問小弟真是慚愧
小弟會去檢討檢討的 ...

這幾天真是感謝 aftcast 您的鼎力相助了
祝您新年快樂阿


===================引 用 aftcast 文 章===================
附我的程式碼:

[code cpp]
PAlphaColorRecArray ptr;
TBitmapData mBitmapData;

if (OpenDialog1->Execute()) {
TBitmap *temp = new TBitmap(OpenDialog1->FileName); // 與你不同
Image1->Bitmap->Assign(temp); // 與你不同,以上是考量效能

temp->Map(TMapAccess::maReadWrite, mBitmapData);
ptr = PAlphaColorRecArray(mBitmapData.Data);

for (int i=0, gray =0; i < temp->Width * temp->Height; i ) {
gray = 0.299 * (*ptr)[i].R 0.587 * (*ptr)[i].G 0.114 * (*ptr)[i].B;
(*ptr)[i].R = (*ptr)[i].G = (*ptr)[i].B = (byte) gray;
(*ptr)[i].A = 0xFF; // 0x80 這裡alpha 測好玩的
}

temp->Unmap(mBitmapData);
Image2->Bitmap->Assign(temp);
delete temp;
}

[/code]

系統時間:2024-04-25 14:31:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!