2011-05-16 67 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