【发布时间】:2014-02-09 08:21:27
【问题描述】:
我已经从答案帖子here改编了这段代码的一部分,它将屏幕截图 jpg 图像保存到缓冲区中。我正在使用 sendo() 通过 UDP 发送这个缓冲的图像。我无法转换这个发回的 char 数组数据成图像。感谢您提供的任何帮助
void gdiscreen()
{
char buffer[61400];
using namespace Gdiplus;
wchar_t filename[200];
memset(filename,0,sizeof(filename));
cnt++;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
EncoderParameters encoderParameters;
ULONG quality;
{
HDC scrdc, memdc;
HBITMAP membit;
scrdc = ::GetDC(0);
int Height = GetSystemMetrics(SM_CYSCREEN);
int Width = GetSystemMetrics(SM_CXSCREEN);
memdc = CreateCompatibleDC(scrdc);
membit = CreateCompatibleBitmap(scrdc, Width, Height);
HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);
BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
Gdiplus::Bitmap bitmap(membit, NULL);
CLSID clsid;
GetEncoderClsid(L"image/jpeg", &clsid);
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
quality = 20;
encoderParameters.Parameter[0].Value = &quality;
IStream *pStream = NULL;
LARGE_INTEGER liZero = {};
ULARGE_INTEGER pos = {};
STATSTG stg = {};
ULONG bytesRead=0;
HRESULT hrRet=S_OK;
// this is your buffer that will hold the jpeg bytes
DWORD dwBufferSize = 0; // this is the size of that buffer;
hrRet = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
bitmap.Save(pStream, &clsid, &encoderParameters);
hrRet = pStream->Seek(liZero, STREAM_SEEK_SET, &pos);
hrRet = pStream->Stat(&stg, STATFLAG_NONAME);
dwBufferSize = stg.cbSize.LowPart;
// copy the stream into memory
hrRet = pStream->Read(buffer, stg.cbSize.LowPart, &bytesRead);
}
}
sendto() 函数是:
sendto(s,buffer,sizeof(buffer) , 0 , (struct sockaddr *) &si_other, slen)
【问题讨论】:
-
你试过memcpy()吗?
-
什么是试图再次转换回来的代码?
-
首先尝试检测代码的哪一部分有问题:屏幕截图提取或通过 sendto/recv 传输数据。比较发送前和接收后的二进制数据。
-
我没能写代码-接收上面发送的字符数据的套接字函数是recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen))。这里是buf也是字符数组
-
@KonstantinL 问题不在于我提供的代码。我只是想将接收到的字符数组转换回图像数据。
标签: c++ image visual-c++ winsock