看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) g++、vc# 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) opencv 問題(Question): 從c++的dll回傳圖片給c# 補充說明(Supplement): 請問該如何實現這個功能呢?? 目前是可以從c#丟圖給c++,但是回傳的時候一直無法成功 麻煩大家了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.125.20.92 diabloevagto:轉錄至看板 C_Sharp 05/03 00:18
QQ29:是不是要用到傳說中的COM Interop... 05/03 00:34
diabloevagto:不太清楚..google都找不到= = 05/03 00:38
※ 編輯: diabloevagto 來自: 140.125.20.92 (05/03 00:39)
QQ29:你指的回傳無法成功 是甚麼意思啊 你是怎麼呼叫到native c++ 05/03 00:43
QQ29:的呢? 直接dllimport嗎 05/03 00:44
QQ29:我之前是用COM Interop, managed C# new一塊buffer 05/03 00:46
QQ29:[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] 05/03 00:47
purincess:回傳圖的type是什麼? 如果你接受R+G+B三個byte的byte ar 05/03 00:47
QQ29:C#這種怪語法去pass到C++ dll去做一些操作 也不用return東西 05/03 00:47
purincess:ry的話在C#分配好空間 C++ dll負責塞就好... 05/03 00:47
purincess:QQ29大大搶先惹XD! 05/03 00:48
EdisonX:請教,gcc/g++ 編的dll,給 vc / c# 可用 ? 05/03 00:52
我希望能夠從c++回傳一張圖給C#,因為我要把處理之後的影像秀出在picturebox 之前把圖從c#丟到c++是直接用DllImport傳bitmapdata.scan0過去然後用mat.data去接 現在要把圖從c++丟回c#想說也能直接這樣丟... 但一直失敗= = 其實用什麼方式回傳都可以,只要能正常秀圖就好
diabloevagto:toEdisonX:可以 05/03 01:03
james732:建議說明是怎麼個"失敗"法 05/03 01:05
diabloevagto:http://ppt.cc/nAgR 出現這樣圖,然後直接當掉= = 05/03 01:07
diabloevagto:其實我一點頭緒都沒有Orz 05/03 01:08
請問QQ29大大有成功寫過類似的程式嗎? 不知是否能借我參考看看該怎樣寫... ※ 編輯: diabloevagto 來自: 114.41.86.28 (05/03 01:38)
purincess:你的dll的func有宣告是stdcall的calling convention嗎 05/03 02:13
purincess:建議你先分離"dll工作傳回值"這件事情 例如做一個最簡 05/03 02:13
purincess:單的 int add(int* in1, int* in2, int* out) 這樣子 05/03 02:13
diabloevagto:http://ppt.cc/se3; 這是我的dll檔 05/03 02:26
diabloevagto:p大,抱歉了...不太懂你說的那個東西 05/03 02:26
diabloevagto:但簡單的傳兩個值,及傳圖都有成功測試過了 05/03 02:27
purincess:所以DLL_Add跟test都ok嗎? 05/03 02:31
purincess:如果是showPic的話你的C#那邊應該要有cv::Mat對應的 05/03 02:31
purincess:type definiation 然後我覺得接參數都要用pointer接 05/03 02:31
purincess:C#那邊加ref這個keyword(吧我記得orz...這邊不確定) 05/03 02:32
purincess:這邊應該沒有要用COM Interop吧? 不然接物件只能用 05/03 02:32
purincess:IDispatch* 接 這可能就會回到前面QQ29大大的範圍了QQ 05/03 02:32
diabloevagto:http://ideone.com/7ioZP c#程式長這樣 05/03 02:44
diabloevagto:那幾個程式是都ok可以跑,傳過去沒有問題 05/03 02:45
diabloevagto:問題就在於從c++傳回來...我想法是一樣傳scan0過去 05/03 02:46
diabloevagto:然後把他指向新的圖的mat.data,但程式直接當掉... 05/03 02:46
purincess:你是說你要改scan0這個pointer裡面存的address還是它 05/03 02:53
purincess:指到的記憶體空間的內容@@? 05/03 02:53
purincess:如果是後者~你lockbits不能傳imagelockmode.readonly~ 05/03 03:01
purincess:要傳readwrite呀 XD 05/03 03:02
purincess:3點了QQ 睡覺! purincess.signOut(); 05/03 03:02
diabloevagto:如果能夠直接改指向的位址當然最快 05/03 03:09
diabloevagto:不然要一個一個寫進去比較花時間 05/03 03:09
diabloevagto:我太懂c#語法,這個是看到有人寫這樣就拿來用 05/03 03:10
diabloevagto:請問我該如何改才能夠修改呢?? 05/03 03:10
diabloevagto:另外請教是否有方式能少到bitmapdata??能直接用 05/03 03:11
diabloevagto:bitmap型態呢?這樣應該能在省一點時間吧 05/03 03:11
c# code http://ideone.com/zZ9Mg c++ code http://ideone.com/UcoLa 我這樣雖然不會出錯了 但是圖片都是整片黑色的... 不知道是不是沒有傳回來... ※ 編輯: diabloevagto 來自: 140.125.20.92 (05/03 14:35)
purincess:你的stride是2*960 然後imread第二個參數是0 會讓我覺得 05/03 17:55
purincess:你的format8ppindexed應該要是Format16bppGrayScale @@ 05/03 17:56
purincess:但我不知道imread第二個參數0的data長怎樣orz 我只用過 05/03 17:56
purincess:正數讀彩圖QQ 05/03 17:56
diabloevagto:imread設定0表示讀進來的是256灰階 05/03 21:17
diabloevagto:用Format8bppIndexed沒錯,我改成你那個就出錯了 05/03 21:17
diabloevagto:我是猜測會不會是pixel資訊沒有回傳回來 05/03 21:18
diabloevagto:stride我用i*960,i從1~20都是黑色的 05/03 21:38
purincess:嗯嗯 QQ 05/03 21:49
diabloevagto:真的是囧到底 05/03 22:06