用GDI++显示二进制图片的问题

时间:2022-11-12 22:41:57
问题:用socket下载图片,再用GDI+显示图片,结果图片显示不出来。

目的是用socket从网上下载一个图片,然后用GDI+显示出来。程序分为了二个步骤,第一步用socket下载图片,第二步用GDI+进行显示。之前作了单步测试。

第一步用socket下载图片的测试,最初是将用recv函数接收的数据存为图片文件,但发现生成的图片文件与原图大小不相符,而且图片显示不出来,估计问题的关键就是这一步。后来又直接将接收的二进制图片数据用GDI+来显示,仍然显示不出来。

第二步用GDI+显示图片的测试,我是用一张本地的图片直接加载,显示没问题。

没多少分了,但要解决问题就不能吝啬,50分是我20%的财产,各位兄弟就当帮个忙,谢谢!

下面是代码:


//实现函数
//将socket下载的二进制图片数据存放IStream中,并返回
IStream *Pic()
{
IStream*   istream;  //要返回的值

int result=0;
int len=0;
struct sockaddr_in address;

WORD wVer;
WSADATA wsaData;
int err;

wVer = MAKEWORD(2,1);
err = WSAStartup(wVer, &wsaData);
if (err != 0)
{
return 0;
}

//初始化地址结构
SOCKET sockfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("61.153.202.157");
address.sin_port = htons(80);
len = sizeof(address);
//连接服务器
result = connect(sockfd, (struct sockaddr *)&address, len);

if (result == -1)
{
istream = 0;
return istream;
}
//组成请求字符串
string sendBuffer = "GET /image/mlogo.gif HTTP/1.1\r\n";
sendBuffer += "Host: www.vckbase.com\r\n";
sendBuffer +="Accept: www/source; text/html; image/gif; image/jpeg; */*\r\n";
sendBuffer += "Connection: close\r\n\r\n";
int w_rs=0;
//发送请求
w_rs = send(sockfd,sendBuffer.c_str(),sendBuffer.size(),0);
char RecvBuffer[6001];
char Text[50000];

char *offset=0;
int nSize = 0;
int rSize = 0;
while (true)
{
memset(RecvBuffer, 0, sizeof(RecvBuffer));
//接收返回的信息
result = recv(sockfd,RecvBuffer,6000,0);
if (result <= 0)
{
break;
}
RecvBuffer[result] = '\0';
strcpy(Text, RecvBuffer);
rSize += result;
}


Text[rSize] = '\0';
//找到返回的相应头

offset = strstr(Text, "\r\n\r\n");


if(offset == NULL)
{
offset = &Text[0];
}
else
{
offset = offset + 4;
}

nSize += Text + rSize - offset;

//offset是内存中图象数据, nSize是它的长度
HGLOBAL   m_hGlobal   =   GlobalAlloc(GPTR, nSize); 
VOID*   global_addr   =   GlobalLock(m_hGlobal); 
memcpy(global_addr,offset, nSize); 
CreateStreamOnHGlobal(m_hGlobal, true, &istream); 
closesocket(sockfd);
return istream;
}



//调用函数,用GDI+显示图片
case WM_PAINT:
{
//初始化GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

hdc = BeginPaint(hwnd, &ps);
Graphics graphics( hdc ); 

IStream *iStream;
iStream = Pic();
//Image *img = new Image(TEXT("C:\\3.jpg"));
Image *img = new Image(iStream);
graphics.DrawImage( img, 0, 0, 50, 100 );
delete img;
EndPaint(hwnd, &ps);
break;
}

6 个解决方案

#1


哎呀呀,这是咋了
一个回复都没有

#2


原因就在于你下载的数据图片文件内容不对,你多加了http信息头,把信息头也当作图片的内容写到文件里了,所以不对。
在你发送下载请求后先接收信息头,接收完信息头后再开始接收实际的数据体,信息头结束的标志是连续两个空行,也就是连接两个"\r\n"之后的数据都是实际的数据体。

#3


同意楼上,GET请求成功后,返回的图片数据是和"HTTP/1.1 200 OK"头在一起的,得先把该头去掉,只要找到"\r\n\r\n"之后便是数据

#4


lz可以把下载的图片存为文件,看格式是否正确,参考2楼的意见。

#5


UrlDownloadToFile一个API就可以下载图片文件。

#6


先保存位文件看是不是正确,再显示出来。

#1


哎呀呀,这是咋了
一个回复都没有

#2


原因就在于你下载的数据图片文件内容不对,你多加了http信息头,把信息头也当作图片的内容写到文件里了,所以不对。
在你发送下载请求后先接收信息头,接收完信息头后再开始接收实际的数据体,信息头结束的标志是连续两个空行,也就是连接两个"\r\n"之后的数据都是实际的数据体。

#3


同意楼上,GET请求成功后,返回的图片数据是和"HTTP/1.1 200 OK"头在一起的,得先把该头去掉,只要找到"\r\n\r\n"之后便是数据

#4


lz可以把下载的图片存为文件,看格式是否正确,参考2楼的意见。

#5


UrlDownloadToFile一个API就可以下载图片文件。

#6


先保存位文件看是不是正确,再显示出来。