FireMonkey2 圖片處理不完全 |
答題得分者是:aftcast
|
炎峰
一般會員 發表:7 回覆:9 積分:3 註冊:2011-03-16 發送簡訊給我 |
各位大大新年快樂~
最近突然想玩玩 C Builder XE3 的 FireMonkey 2,但是遇到了些怪怪的問題 載入圖片然後對圖片做些處理,像是灰階、二值化等等東西 以灰階為例,大圖片(如1152*864)處理上完全沒問題... 但是如果換成小一點的圖片(如300*200)就會發生下半部沒有處理完... 灰階程式碼為... [code cpp] int gray = 0, i = 0; [/code]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; } 不僅灰階有問題...二值化、Sobel 啥的都會發生這問題 測試時有使用 SaveToFile 把處理後的圖片存下來 大圖確定底下都有處理完全! 並不是因為 Stretch 的關係而沒看到 ... 請大大們幫忙看看這是什麼問題吧,在此先感謝大大們 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
炎峰
一般會員 發表:7 回覆:9 積分:3 註冊:2011-03-16 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,那我進一步的猜測是
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 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,我又再次看了又看,實在想不出有什麼可能性… 加上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 發送簡訊給我 |
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 發送簡訊給我 |
附我的程式碼:
[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 發送簡訊給我 |
小弟用您的程式碼測試......還是不行
不過...小弟去另一台電腦測試卻不會出現這問題 冏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] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |