在图像上添加文本并返回内存

时间:2014-04-03 18:55:59

标签: c++ image-processing jpeg gdi+

目前,我使用这个简单的库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();
}

0 个答案:

没有答案