2011-05-16 130 views
0

我創建了一個應用程序,我需要通過套接字發送圖像的剪切部分。我已經使用StretchBlt()裁剪了圖像,我也能夠將裁剪後的圖像顯示並保存到位圖文件中。如何使用WIN32和C++通過套接字發送HBITMAP?

接下來,我想通過Socket連接發送這個cropepd圖像。套接字之間的連接已建立,我的問題是如何通過Socket發送/接收此圖像,因爲send()和recv()函數需要char *。

一個想法是,如果我選擇HBITMAP到一個memDC對象比我可以直接發送到遠程套接字的memDC?

任何更簡單的方法來實現這項任務?

回答

4

您不能將HBITMAP(它是一個HANDLE,內存中的引用指針)傳遞給另一臺機器。您可以使用GetBitmapBits Function將HBITMAP轉換爲字節數組並使用send()發送該字節數組。

另一方面,您將不得不創建另一個兼容位圖,並在recv()後使用SetBitmapBits Function

+0

謝謝@Simon:它相當於使用GetDIBits()和SetDIBits()嗎?文檔說明「注意此功能僅用於兼容16位版本的Windows,應用程序應使用GetDIBits函數」,我應該使用哪組函數? – aProgrammer 2011-05-16 08:46:18

+0

@TheAmitKumar - 這是一箇舊的API,但它仍然存在。我肯定會嘗試它,否則Get/Set DIBits很好。 – 2011-05-16 10:12:24

+0

另一個問題是如何獲得HBITMAP的大小?如果我使用舊的API而不是單獨發送BITMAPHEADER,或者GetBitmapBits()返回的字節數組也會照顧頭文件?我嘗試使用更新的API獲取/設置DI位,但對大小和頭文件無能爲力操縱。感謝好友... – aProgrammer 2011-05-16 10:29:11

2

通常發送原始內存將是一個壞主意 - 即使你保證今天總是有一臺Windows機器在另一端,它對未來不是很靈活 - 如果你想改變到不同的平臺,或者甚至開始使用純粹的Win32 .NET?

我推薦做的是將裁剪後的圖像保存到一個.bmp文件,然後通過套接字發送文件像任何其他。這樣你就可以爲你所做的事情提供最大的靈活性。

不幸的是,如果你在C++/win32下工作,輸出一個位圖是一個噩夢。下面是輸出位圖的代碼,我基於幾個來源將它們拼湊在一起 - 它使用了我們的一些類成員,但是您應該能夠弄清楚如何在那裏插入正確的值。

http://pastebin.com/gLw7ykMU

希望這有助於!

+0

謝謝@Colen:..你的代碼示例真的很有幫助。在我開始編寫應用程序的這部分之前,我還有一件事要問。如果我將位圖文件作爲二進制文件打開並將char數據塊發送到文件結尾。而在遠程端,我把它作爲一個位圖文件存儲,這足夠了嗎?...這不是一個項目,這只是一個經理給予的練習,(不幸的是)他只是對快速輸出感興趣。當經理建議我進行免費談話時,會直接發送這個memDC是一種選擇嗎?再次感謝。 。 。 – aProgrammer 2011-05-16 07:20:02

+0

老實說不知道答案,對不起。試試看,並找出:) – Colen 2011-05-16 15:05:27

相關問題