MFC使用URL讀取圖片

MFC使用url地址讀取圖片

該方法讀取的作用?

很多情況下我們是使用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;
}

到這裏我們的代碼寫完了,運行項目點擊獲取圖片按鈕即可顯示圖片啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章