服务器端接收到图片数据后,用StretchDIBits()方法重新显示失败dc上面重新显示失败!求指点

fengsuiyingdong BY 2012-12-07 03:31:14
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())没有显示相应的图片

...全文
128 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
探索21 2012-12-08
send(sockClient,(char *)pBmpBuf,sizeof(pBmpBuf),0); 图像数据没有发送成功,pBmpBuf为指向图像数据的指针,所以不应用sizeof(pBmpBuf) 你再试试
回复
fengsuiyingdong 2012-12-07
经过断点调试发现接收数据时:          int flag; flag =recv(sockConn, imgBuffer,sizeof(imgBuffer), 0); imgBuffer[flag]='\0'; imgBuffer数组里面存储的是: [0]16 [1]30 [2]29 [3]-90 [4]0 [5]0 [6]0 ……其余全部为0  我现在认为 flag =recv(sockConn, imgBuffer,sizeof(imgBuffer), 0); imgBuffer[flag]='\0';  这两行代码没有正确的接收图像数据?  求指教
回复
fengsuiyingdong 2012-12-07
补充下: 用UltraEdit软件打开两张图片对比了,发现BMP图片的头(文件头、信息头、及颜色表)58个字节是一致的。只是接收后的图片数据95%以上显示都为0
回复
相关推荐
发帖
图形处理/算法
创建于2007-09-28

1.9w+

社区成员

VC/MFC 图形处理/算法
申请成为版主
帖子事件
创建了帖子
2012-12-07 03:31
社区公告
暂无公告