maj*_*rif 4 c++ windows networking bitmap
我正在尝试截取整个屏幕的屏幕截图,并希望通过网络将其发送到服务器。(服务器将保存它)
我目前正在使用这段代码
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, w, h);
CImage image;
image.Attach(hBitmap);
image.Save(L"screen.jpg");
Run Code Online (Sandbox Code Playgroud)
它确实保存了文件,但这不是我想要的。我也不确定如何获取字节,我正在考虑,GetBits()但文档说它是指向底层位图数据的指针。
我想要得到的是 JPG 数据,我可以通过网络发送该数据并使用服务器保存图像。
那么,为什么我不直接使用位图并直接发送呢?因为它有点复杂并且代码很长,所以您必须获取标头和其他内容。但我可能是错的。
我的问题:
- 如何从图像中获取字节以便将其发送到服务器?(就像保存到数据库的 BLOB)
- 有任何库可以帮助我转换并获取内存中的所有字节吗?
references:
https://msdn.microsoft.com/en-us/library/ms535406(v=VS.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms535406(v=vs.85).aspx
http://www.codeproject.com/Tips/738533/save-load-image-between-buffer
Run Code Online (Sandbox Code Playgroud)
所以 Dan 指出,实际上有一个方法 Save 可以使用 Stream。我决定使用这种方法,这是我从问题中列出的参考文献之一中得到的
vector<BYTE> buf;
IStream *stream = NULL;
HRESULT hr = CreateStreamOnHGlobal(0, TRUE, &stream);
CImage image;
ULARGE_INTEGER liSize;
// screenshot to jpg and save to stream
image.Attach(hBitmap);
image.Save(stream, Gdiplus::ImageFormatJPEG);
IStream_Size(stream, &liSize);
DWORD len = liSize.LowPart;
IStream_Reset(stream);
buf.resize(len);
IStream_Read(stream, &buf[0], len);
stream->Release();
// just testing if the buf contains the correct data
fstream fi;
fi.open("aaashot.jpg", fstream::binary | fstream::out);
fi.write(reinterpret_cast<const char*>(&buf[0]), buf.size()*sizeof(BYTE));
fi.close();
Run Code Online (Sandbox Code Playgroud)