1、读入图片进内存及发送函数如下:
问题描述:
功能:读取bmp图片到内存,通过socket函数中的send方法将数据传送到接收端
1、
unsigned char *pBmpBuf; //读入图像数据的指针
bool readBmp(char *bmpName)
{
//二进制读方式打开指定的图像文件
FILE *fp=fopen(bmpName,"rb");
if(fp==0) return 0;
......
//申请位图数据所需要的空间,读位图数据进内存
pBmpBuf=new unsigned char[lineByte * bmpHeight];
fread(pBmpBuf,1,lineByte * bmpHeight,fp);
//关闭文件
fclose(fp);
return 1;
}
int socket()
{
......
send(sockClient,(char *)pBmpBuf,sizeof(pBmpBuf),0);
printf("************Send Successfully!************\n");
closesocket(sockClient);
WSACleanup(); // 终止对套接字库的使用
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
socket();
system("pause");
return 0;
}
二、服务器接收代码如下:(1)、我把socket接收的代码写在了函数
void CquickViewClientView::OnDraw(CDC* pDC)
{
//图像的宽、高等信息是从客户端读入内存时得到,这一点理解是应该通过客户端发送位图的头文件来得到
int bmpWidth=440;//图像的宽
int bmpHeight=330;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount=24;//图像类型,每像素位数
//socket建立连接的过程,bind()->listen()……
char imgBuffer[435600]; //接收图像数据缓存 大小是根据发送时的测试图片大小得到
int flag; //接收标志
flag =recv(sockConn, imgBuffer,sizeof(imgBuffer), 0);
imgBuffer[flag]='\0';
char showBuffer[435600];
memcpy(&showBuffer,imgBuffer,sizeof(imgBuffer)); //接收到图像数据存到showBuffer数组中
if(flag>0) //接收到的数据不为空
{
//接收到的图像信息处理,保存本地的同时显示到mfc的界面上
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
int colorTablesize=0;
if(biBitCount==8)
{
colorTablesize=1024;
}
//待存储图像数据每行字节数为4的倍数
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
////以二进制写的方式打开文件
FILE *fp=fopen("zpl.bmp","wb");
if(fp==0) return;
//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ colorTablesize + lineByte*bmpHeight;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是图像文件前3个部分所需空间之和
fileHead.bfOffBits=54+colorTablesize;
//写文件头进文件
fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head;
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=bmpHeight;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*bmpHeight;
head.biWidth=bmpWidth;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//写位图信息头进内存
fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
//如果灰度图像,有颜色表,写入文件
if(biBitCount==8)
fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
//写位图数据进文件
fwrite(showBuffer, bmpHeight*lineByte, 1, fp); //将图片保存到本地
//关闭文件
fclose(fp);
HDC hdc;
StretchDIBits(hdc,0,0,128,128,0,0,128,128,&imgBuffer,(BITMAPINFO*)&head,DIB_RGB_COLORS,SRCCOPY); //显示到mfc的界面上
}
}
描述:
1、服务端启动后,接收客户端传输的图片数据后本地保存zpl.bmp图片为一个440*330大小为425KB的图片(图片尺寸与大小都正确),但图片全部为黑色(最上方有一点点各种颜色的像素点)
2、MFC的主窗口(StretchDIBits())没有显示相应的图片
