【问题标题】:Convert bitmap bits from GetDIBits to jpeg for winsock transmission将位图位从 GetDIBits 转换为 jpeg 以进行 winsock 传输
【发布时间】:2013-05-10 20:00:38
【问题描述】:

我正在制作屏幕截图并将位图的位检索到字符缓冲区中。我想通过winsock把它发送到另一个程序。这是成功的,但发送位图会消耗处理器,所以我想压缩位图以通过 winsock 发送。

我应该使用 GDI 的哪些库或方法? 我不熟悉 GDI+,所以我更喜欢非 GDI+ 解决方案。如果需要 GDI+,欢迎提供任何指向优秀教程的链接。

一旦我收到从服务器到客户端的位,我将如何将其显示回来>?普通的 bitblt 函数是否可以与缓冲区一起使用,或者我该怎么做?

谢谢。

【问题讨论】:

  • 是否允许有损压缩?如果是这样,请使用 JPEG 格式。这在 gdi 中不可用,但在 gdi plus 中。如果你不想要 gdiplus,有开源 jpeg 库。对于屏幕截图,png 格式可能会更好。
  • 如果目标只是减少带宽,那么当您可以使用 gzip 之类的真实压缩方式按原样压缩位图数据时,转换为另一种图像格式是毫无意义的。
  • @RemyLebeau:我理解你的意思,但 JPEG 的压缩肯定是“真实的”。 “无损”(或者可能是“通用”,而不是面向图片)会是一个更好的描述。

标签: c++ windows winapi gdi+ gdi


【解决方案1】:

如果您想将位图转换为 jpeg,我认为您可以使用名为 jpeglib 的开源库。也许它可以帮助你。

但在我看来,如果只是改变屏幕截图的格式,那不是一个好主意。我认为您应该使用压缩算法来压缩屏幕截图,然后将其发送给客户端。美好的一天。

【讨论】:

  • 好的,你推荐什么库?我的图像使用 new 存储在无符号字符数组中。它的大小为 2800000 字节,无法通过 winsocket 发送。
  • 曾经,我有一个项目。服务器发给我一张jpeg格式的图片,但是我需要把jpeg转换成位图,然后在MFC控件上显示位图。
  • 首先,您的图片数据太大,传输会浪费一些时间。但我对 ZLib 并不熟悉。我搜索过。我认为它会起作用。您问如何将其显示回来。你必须知道位图的结构。
  • 在模拟实时视频的顺序传输图像时,您可以通过仅发送一张图像到另一张图像的差异而不是每次发送完整图像来减少大量带宽。发送基本图像,然后仅发送自上一张图像以来发生变化的像素,依此类推。接收器显示基本图像,然后将更改覆盖在其顶部。每隔一段时间,发送一个新的完整基础映像以进行重新同步。
  • @RemyLebeau 我认为这是个好主意。但它充满了挑战。@Kelvin 我想知道客户端应用程序是否将屏幕截图显示为原始大小。如果没有,您可以缩放屏幕截图。也许会有更好的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多