<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    在VC中顯示和處理圖片的方法

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 落鶴生 發布于 2011-10-21 09:12 點擊:344次  RFID設備管理軟件 來自:blog.csdn.net/mengaim_cn 幾種用GDI畫圖的方法介紹。 TAG: GDI    

    法1:這個方法其實用的是一本經典vc圖像處理的書上的有關讀取位圖的函數庫,

    當沒有這個函數庫時,就沒有太多的實用價值。
    這種方法直接用的是讀取和顯示bmp圖片的函數庫
    首先要得到要顯示區域的位置:
      CWnd* pWnd=GetDlgItem(IDC_BMP);
      RECT rect;
      pWnd->GetClientRect(&rect);
      CDC* pDC=pWnd->GetDC();
    然后調用函數庫
      //獲取DIB圖像的寬度
      int cxDIB=(int)::DIBWidth(lpDIB);
      //獲取DIB圖像的高度
      int cyDIB=(int)::DIBHeight(lpDIB);
    最后也是調用函數庫
            //調用PaintDIB輸出圖像
     ::PaintDIB(pDC->m_hDC,&rect,m_hDIB,&rcDIB,NULL); 
    最要釋放資源
                    ReleaseDC(pDC);


    --------------------------------------------------------------------------------

    法2:
    這種方法是直接在屏幕上畫圖,當然,由于是一點一點的畫的,所以,速度會慢些。
    首先要得到要顯示區域的位置:
      CWnd* pWnd=GetDlgItem(IDC_BMP);
      CDC* pDC=pWnd->GetDC();
    然后
                    pDC->SetPixel(iw,ih,RGB(r,g,b));
    最要釋放資源
                    ReleaseDC(pDC);


    ------------------------------------------------------------------------------------

    法3:
    這種方法是在內存中開辟一個空間,然后也用SetPixel的方法往內存中寫數據,最后可以一次性地把數據顯示在屏幕上。當然,從描述上就知道,這種方法比法2要快些,但是,由于使用SetPixel,一個點一個點的寫數據,也會有些慢的。

    首先要得到要顯示區域的位置:
      CWnd* pWnd=GetDlgItem(IDC_BMP);
      CDC* pDC=pWnd->GetDC();
    然后
     CDC memdc;
     CBitmap m_bitmap,*m_pOldBitmap;

     memdc.CreateCompatibleDC(pDC);
     m_bitmap.CreateCompatibleBitmap(pDC,lWidth,lHeight);
     m_pOldBitmap=memdc.SelectObject(&m_bitmap);
    然后,就可以改變內存中的數據了
            memdc.SetPixel(iw,lHeight-ih,RGB(nrgb,nrgb,nrgb));
    將結果顯示出來
     pDC->StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,
      0,0,lWidth,lHeight,SRCCOPY);
    最后釋放資源
     memdc.SelectObject(m_pOldBitmap);
     m_bitmap.DeleteObject();
     ReleaseDC(pDC);

    -----------------------------------------------------------------------------------

    法4:
    這種方法挺不錯的,一定要好好看看:)
    這應該是比法2和法3都快的方法了,因為其是直接在內存中分配一個區域,直接用操作內存區域的方法去操作它,等操作完成后在一次寫到屏幕上。
    首先,得到要顯示的區域
       CWnd* pWnd=GetDlgItem(IDC_IMG);
       CDC *theDC=pWnd->GetDC();
       CRect clientRect;
       pWnd->GetClientRect(clientRect);
    然后,寫頭文件
       BITMAPINFOHEADER bmiHeader;
       bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
       bmiHeader.biWidth = m_width;
       bmiHeader.biHeight = m_height;
       bmiHeader.biPlanes = 1;
       bmiHeader.biBitCount = 24;
       bmiHeader.biCompression = BI_RGB;
       bmiHeader.biSizeImage = 0;
       bmiHeader.biXPelsPerMeter = 0;
       bmiHeader.biYPelsPerMeter = 0;
       bmiHeader.biClrUsed = 0;
       bmiHeader.biClrImportant = 0;
    現在就可以顯示出圖像數據在屏幕上了
       // now blast it to the CDC passed in.
       // lines returns the number of lines actually displayed
       int lines = StretchDIBits(theDC->m_hDC,
          left, top,
          bmiHeader.biWidth,
          bmiHeader.biHeight,
          0,0,
          bmiHeader.biWidth,
          bmiHeader.biHeight,
          tmp,
          (LPBITMAPINFO)&bmiHeader,
          DIB_RGB_COLORS,
          SRCCOPY);
    注意呀,其中的tmp的類型是BYTE* ,也就是說其是指向一塊內存區首地址,只要這塊內存區中放的數據是BMP位圖中的數據區的格式,就可以了。也就是說每行元素都是32 bit(4 byte)的整數倍。

    有了這種方法,可以說,可以直接用分配內存的函數先分配一個內存區域,然后,用memcpy將一個內存中的內容復制到另一個內存中,對其處理后,再顯示出來。

    最后別忘了釋放資源
       ReleaseDC(theDC);

    ------------------------------------------------------------------------
    另外,獲得整個對話框的CDC,不好意思,不知道CDC是什么
      CPaintDC dc(this);
      CDC *theDC=&dc;

    (mengaim_cn)   本站文章除注明轉載外,均為本站原創或編譯歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動,同學習共成長。轉載請注明:文章轉載自:羅索實驗室 [http://www.rosoo.net/a/201110/15172.html]   RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全