目前,我使用这个简单的库ImageStone来编写图像用途的文本。 我真的需要在图像处理结束时获得jpeg(数据作为内存),因为我需要通过socket发送它。 我不太了解像这样的图像库和gdi +。我只需要为我的截图添加一些信息。如果你知道一个更好的解决方案或另一个库,它将我的图像转换回jpeg并将返回内存。 用2个字:只需要在jpeg图像上添加文本(作为数据),并且需要回到jpeg格式(也作为数据)。
void DrawTextImage(HDC dc)
{
// GDI draw text
SetTextColor(dc, RGB(0, 0, 255));
TextOutA(dc, 0, 0, "SampleText", 10);
// GDI+ draw text
Gdiplus::Graphics g(dc);
g.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
g.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
Gdiplus::FontFamily ffami(L"Arial");
Gdiplus::StringFormat fmt;
Gdiplus::GraphicsPath str_path;
str_path.AddString(L"Sample Text", -1, &ffami, Gdiplus::FontStyleBold, 48, Gdiplus::Point(20, 20), &fmt);
Gdiplus::Pen gp(Gdiplus::Color::Black, 8);
gp.SetLineJoin(Gdiplus::LineJoinRound);
Gdiplus::Rect rc(20, 20, 30, 60);
Gdiplus::Color cStart(255, 255, 255);
Gdiplus::Color cEnd(0, 128, 255);
Gdiplus::LinearGradientBrush gb(rc, cStart, cEnd, Gdiplus::LinearGradientModeVertical);
g.DrawPath(&gp, &str_path);
g.FillPath(&gb, &str_path);
}
void SendScreenShot(const void *buffer, int size)
{
TCPSocketConnection FileServer;
EndPoint ServerAddress;
char *memory;
file_struct data;
data.size = size;
memory = new char[size];
memcpy(memory, buffer, size);
//time_t czas;
//time(&czas);
//asctime(localtime(&czas));
Image.Load(memory, size, IMG_JPG);
DrawTextImage(FCImageDrawDC(Image));
FileServer.Connect(Addon->GetAddress(), Addon->GetPort() + 1);
FileServer.Send((char *) &data, sizeof(file_struct));
Sleep(500);
// need to convert back to jpeg raw data here
FileServer.SendAll((char *)buffer, size);
FileServer.Close();
delete memory;
Image.Destroy();
}