socket接收的char数组如何保存成bmp或JPG图片

雪狼__ 2014-11-12 05:03:08
从socket接收数据保存到char img[10000]中,如何把char img[10000]转换成jpg或bmp图片,并保存到本地硬盘?图片的大小是变化的,10000个字符中,可能有的是空,有的是图片数据。


请给予指点,谢谢!
我用的是VS2010
...全文
650 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
1、你的这个问题就是如何传文件,你可以参考下9楼的代码。 2、你回复别人的回复的时候最好引用下,这样别人可以看到系统的提示。 3、这个论坛的第一个回复就是1楼,最上层是楼主楼。
雪狼__ 2014-11-17
  • 打赏
  • 举报
回复
包头定义结构体号码和结构体大小,每个结构体前有4个同步字符
oyljerry 2014-11-17
  • 打赏
  • 举报
回复
主要是要注意用二进制方式把接收到的数据写入文件,而不是用字符串。 然后就是自定义协议处理,解包,拿出接收到的数据
xian_wwq 2014-11-14
  • 打赏
  • 举报
回复
如何保存取决于 发送端是如何把bmp或者jpg转换成char[]的 按照转换规则进行逆操作
zhubo_1117 2014-11-13
  • 打赏
  • 举报
回复
这种情况最好定一个协议,能够协商好每次发送图像数据的大小,在接收端解析协议,通过发送的图像大小来截取数组中的有效图像数据。
zgl7903 2014-11-13
  • 打赏
  • 举报
回复
最简单的自定义一个协议, 最前面几个字节表征数据大小, 然后接收端按这个大小将数据写入文件
puj2003 2014-11-13
  • 打赏
  • 举报
回复
简单点,按照文件方式来传输 一端读图片: send() { char buf[MAX_PATH]; FILE *fq; CFile file; int words = 0; file.Open("e:\\车辆.jpg",CFile::modeRead); int len,opt = 1; memset(buf,‘\0',MAX_PATH); while(TRUE) { len = file.Read(buf, MAX_PATH); if(len<=0) break; words = send(m_client2, buf, len, 0); if(SOCKET_ERROR == words) { int error = WSAGetLastError(); CString ErrorStr; ErrorStr.Format("%d",error); MessageBox(_T("错误码:" + ErrorStr),_T("警告"),MB_OK); return; } } UpdateData(); file.Close(); } 另一端接收图片: DWORD WINAPI ReceiveImageThread(LPVOID IpParameter) { int iMode = 1; //0:阻塞 ioctlsocket(m_ImageClient, FIONBIO, (u_long FAR*)&iMode); //非阻塞设置 /*启动接收图片线程*/ char recvBuf[MAX_PATH]; CFile file; while(TRUE) { memset(recvBuf, '\0', MAX_PATH*sizeof(char)); int buflen = recv(m_ImageClient, recvBuf, MAX_PATH, 0); if(SOCKET_ERROR == buflen) { TRACE("图片数据接收失败"); continue; } else if(0 == buflen) { return 0; } else if(0 < buflen) { // 处理数据 file.Open(_T("e:\\traffic.jpg"),CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate ); file.SeekToEnd(); file.Write(recvBuf,buflen); file.Close(); } } return 0; }
赵4老师 2014-11-13
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
版主大哥 2014-11-12
  • 打赏
  • 举报
回复
1.发送端,发送的是图片或者不是图片,接收端肯定知道,因为是事先商量好的协议 2.发送端,发送的数据是图片,那么接收端不涉及显示,那么就直接收到完整的图片数据保存就好了(是jpg还是bmp自定义的协议可以知道,如果没做到,那么也可以使用bmp头去试,因为bmp头有图像大小像素等信息) 所以我在猜,是不是楼主想问题的时候发送端,怎么把图片转换成bmp或其他格式,然后发送。是不?
赵4老师 2014-11-12
  • 打赏
  • 举报
回复
1楼代码包含将内存位图保存为bmp文件的功能楼主参考一下。
雪狼__ 2014-11-12
  • 打赏
  • 举报
回复
发送端应该是一次发送完毕的,二楼代码好复杂... 要好好研究了
lx624909677 2014-11-12
  • 打赏
  • 举报
回复
接收的时候大小会根据send端来决定,比如你发送了123个字节,那么接收也一定是123,这样你就能直到要写入文件的实际大小了
赵4老师 2014-11-12
  • 打赏
  • 举报
回复
仅供参考
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <stdio.h>

int main() {
    const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;

    PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);
    pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = uWidth;
    pbmi->bmiHeader.biHeight = uHeight;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 1;
    pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;
    pbmi->bmiColors[0].rgbBlue = 0;
    pbmi->bmiColors[0].rgbGreen = 0;
    pbmi->bmiColors[0].rgbRed = 0;
    pbmi->bmiColors[1].rgbBlue = 255;
    pbmi->bmiColors[1].rgbGreen = 255;
    pbmi->bmiColors[1].rgbRed = 255;

    HDC hDC = CreateCompatibleDC (0);
    void * pvBits;
    HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);
    SelectObject (hDC, hBitmap);
    HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体");
//  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");
    SelectObject (hDC, hFont);
    BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);

    char c[4];
    int i, j;
    for (i = 128; i < 256; i++) {
        sprintf (c, "%02X", i);
        TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);
    }
    for (j = 0; j < 256; j++) {
        sprintf (c, "%02X", j);
        TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);
    }
    for (i = 128; i < 256; i++) {
        for (j = 0; j < 256; j++) {
            c[0] = (char) i;
            c[1] = (char) j;
            TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);
        }
    }
    for (i = 0; i < 130; i++) {
        MoveToEx (hDC, 0, i * 17, NULL);
        LineTo (hDC, uWidth, i * 17);
    }
    for (j = 0; j < 258; j++) {
        MoveToEx (hDC, j * 17, 0, NULL);
        LineTo (hDC, j * 17, uHeight);
    }

    BITMAPFILEHEADER bmfh;
    bmfh.bfType = *(PWORD) "BM";
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;
    bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;

    HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD dwWritten;
        WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);
        WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);
        WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);

        CloseHandle (hFile);
    }

    DeleteObject (hFont);
    DeleteObject (hBitmap);
    DeleteDC (hDC);
    LocalFree (pbmi);

    return 0;
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧