【问题标题】:Retrieving image from character array从字符数组中检索图像
【发布时间】: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


【解决方案1】:

终于解决了……就像保存文件一样简单

std::ofstream("D:\\abc.jpg", std::ios::binary).write(buf,recv_len); 

这里第一个参数是保存文件的位置,第二个是操作模式,因为这里我们正在处理图像数据二进制选择。写入方法是自我解释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2021-01-02
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多