【问题标题】:How to send a HBITMAP over a socket using WIN32 and C++?如何使用 WIN32 和 C++ 通过套接字发送 HBITMAP?
【发布时间】:2017-08-11 01:00:54
【问题描述】:

我创建了一个应用程序,我需要通过套接字发送图像的裁剪部分。我已经使用 StretchBlt() 裁剪了图像,我还能够将裁剪后的图像显示并保存到位图文件中。

接下来,我想通过 Socket 连接发送这个croepd 图像。套接字之间的连接已建立,我的问题是如何通过 Socket 发送/接收此图像,因为 send() 和 recv() 函数需要一个 char *。

一个想法是,如果我将 HBITMAP 选择到 memDC 对象,我可以将 memDC 直接发送到远程套接字吗?

有更简单的方法来完成这项任务吗?

【问题讨论】:

    标签: c++ winapi visual-c++ bitmapimage


    【解决方案1】:

    您不能将 HBITMAP(它是 HANDLE,内存中的引用指针)传递给另一台机器。您可以使用GetBitmapBits Function 将 HBITMAP 转换为字节数组,并使用 send() 发送此字节数组。

    另一方面,您必须创建另一个兼容的位图,并在 recv() 之后使用SetBitmapBits Function

    【讨论】:

    • 感谢@Simon:它等同于使用 GetDIBits() 和 SetDIBits() 吗?文档说“注意此功能仅用于与 16 位版本的 Windows 兼容。应用程序应使用 GetDIBits 功能”,我应该使用哪组功能?
    • @TheAmitKumar - 这是一个旧的 API,但它仍然存在。我肯定会尝试,否则 Get/Set DIBits 很好。
    • 还有一个问题是如何获得 HBITMAP 的大小?如果我使用旧的 API 而不是我需要单独发送 BITMAPHEADER 或者 GetBitmapBits() 返回的字节数组也会处理标题?我尝试使用更新的 API 获取/设置 DI 位,但对大小和标题一无所知操纵。谢谢朋友...
    • 如果为 cbBuffer 传递 0,为 lpvBits 传递 NULL,该函数应返回所需的缓冲区大小。
    【解决方案2】:

    通常发送原始内存是个坏主意——即使你保证今天在另一端总是有一台 Windows 机器,但它对未来不是很灵活——如果你想换一个不同的平台怎么办,或者甚至开始使用 .NET 而不是普通的 win32?

    我建议将裁剪后的图像保存为 .bmp 文件,然后像其他任何方式一样通过套接字发送文件。这样您就可以最大限度地灵活处理您正在做的事情。

    不幸的是,如果您使用 C++/win32 工作,输出位图是一场噩梦。这是输出位图的代码,我根据几个来源拼凑而成 - 它使用了我们的一些类成员,但您应该能够弄清楚如何在其中插入正确的值。

    http://pastebin.com/gLw7ykMU

    希望这会有所帮助!

    【讨论】:

    • 感谢@Colen:.. 你的代码示例真的很有帮助。在我开始编写我的应用程序的这一部分之前,我还想问一件事。如果我将位图文件作为二进制文件打开并将字符数据块发送到文件末尾。在远程,我将其存储为位图文件,这样就足够了吗?...这不是一个项目,这只是经理给出的练习,(不幸的是)他只是对快速输出感兴趣。直接发送 memDC 真的是我的经理在一次免费谈话中建议我的一种选择吗?再次感谢。 . .
    • 老实说不知道答案,抱歉。试试看吧:)
    猜你喜欢
    • 2014-04-29
    • 2014-08-10
    • 2020-03-19
    • 2010-10-19
    • 2013-09-02
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多