分享

MFC使用URL读取图片

 古风银汉 2021-05-22

该方法读取的作用?

很多情况下我们是使用http协议与后端进行交互的,那么我们MFC如何通过url地址来直接显示图片呢?
下面先来看看我在读取的效果图:
这里写图片描述

准备工作

我的后台是使用.NET Core实现的,在这里我提供了图片的地址:http://localhost:5000/images/picture.jpg (当然该地址你们是使用不了的,读者可以找别人网站里面的图片地址来使用),例如:我直接在百度中打开一个图片,然后右键,效果如下:
这里写图片描述
选择复制图片地址,可以在地址栏中检验效果;我本地的图片直接在网页中打开的效果如下:
这里写图片描述
那么我们要如何将该图片显示到MFC里面呢?

实现过程

1、创建一个MFC项目命名为:ShowImg,之后我们在资源视图中为我们的对话框添加button按钮,将Caption(标题)设置为获取图片,并双击创建button响应函数。
2、我们需要向界面中添加图形控件(Picture Control),工具想的快捷键为:Ctrl+Alt+X,找到Picture Control控件拖到界面中(这是最简单的使用控件的方法了)
3、右键Picture Control控件,选择属性,ID设置为IDC_PICTURE,Type选择Frame
4、给Picture Control控件添加变量,右键图像控件,选择添加变量,将变量名设置为m_picture
5、这时候我们在ShowImgDlg.h文件中添加类函数:void showimg(char* imgpath);
6、打开ShowImgDlg.cpp文件实现上面的函数:

void CShowImgDlg::showimg(char* imgpath)
{
    if (finder.FindFile(imgpath))
    {
        CRect rect;
        m_picture.GetClientRect(&rect);
        CImage img;
        img.Load(imgpath);
        CDC *pDC = m_picture.GetWindowDC();
        img.Draw(pDC->GetSafeHdc(), rect);
        ReleaseDC(pDC);
    }
}

7、我们回到我们的button响应函数中代码如下:

温馨提示: 该函数名又你的button ID决定,所以这里你的函数名可能跟我的是不同的。

void CShowImgDlg::OnBnClickedButton()
{
    // TODO: 在此添加控件通知处理程序代码

    showimg((LPTSTR)(LPCTSTR)SavePic("http://localhost:5000/images/picture.jpg"));
}

8、这里会发现我们还没有实现SavePic这个函数,我们这里显示图片实际上是先将图片保存到了本地然后再显示出来的,之前我尝试过直接显示,好像没成功,希望知道做的兄弟可以跟我说说。
SavePic实现:

CString CShowImgDlg::SavePic(CString strImgUrl)  
{  
    DWORD length = 0;  
    BYTE buffer[1024];  
    memset(buffer, 0, 1024);  
    HINTERNET hInternet;  

    hInternet = InternetOpen(_T("Testing"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);  
    if (hInternet == NULL)  
    {  
        return "";  
    }  

    HINTERNET hUrl;  
    hUrl = InternetOpenUrl(hInternet, strImgUrl, NULL, 0, INTERNET_FLAG_RELOAD, 0);  
    if (hUrl == NULL)  
    {  
        InternetCloseHandle(hInternet);  
        return "";  
    }  

    BOOL    hwrite;  
    DWORD   written;  
    HANDLE  hFile;  
    CString path = CreateLocalPath(strImgUrl);  
    hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);  
    if (hFile == INVALID_HANDLE_VALUE)  
    {   
        InternetCloseHandle(hUrl);  
        InternetCloseHandle(hInternet);  
        return "";  
    }  

    BOOL read;  
    while (TRUE)  
    {  
        read = InternetReadFile(hUrl, buffer, sizeof(buffer), &length);  
        if(length == 0)  
            break;  
        hwrite = WriteFile(hFile, buffer, sizeof(buffer), &written, NULL);  
        if (hwrite == 0)  
        {  
            CloseHandle(hFile);  
            InternetCloseHandle(hUrl);  
            InternetCloseHandle(hInternet);  
            return "";  
        }  
    }  
    CloseHandle(hFile);  
    InternetCloseHandle(hUrl);  
    InternetCloseHandle(hInternet);  
    return path;  
}

创建图片路径函数

CString CShowImgDlg::CreateLocalPath(CString strImgUrl)
{
    CString filename = strImgUrl.Right(strImgUrl.ReverseFind('/'));
    CString folderpath = "./urlPic";

    // 判断文件夹是否存在
    if (_access(folderpath, 0) == -1)
    {
        int flag = _mkdir(folderpath);
        if (0 != flag) {
            return "";
        }
    }

    CString str = folderpath + "/" + filename;

    return str;
}

到这里我们的代码写完了,运行项目点击获取图片按钮即可显示图片啦!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多