gpt4 book ai didi

c++ - 将屏幕截图位图转换为内存中的 jpeg

转载 作者:可可西里 更新时间:2023-11-01 09:19:42 24 4
gpt4 key购买 nike

我想截取整个屏幕的屏幕截图,并想通过网络将其发送到服务器。 (服务器将是保存它的那个)

我目前正在使用此代码

HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, w, h);

CImage image;
image.Attach(hBitmap);
image.Save(L"screen.jpg");

它确实保存了文件,但这不是我想要的。我也不确定如何获取字节,我在考虑 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

最佳答案

所以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();

关于c++ - 将屏幕截图位图转换为内存中的 jpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36544155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com