Windows程式設計 讀書筆記 – 與裝置無關的位元影像DIB

來源:互聯網
上載者:User

一、DIB內的位元影像基本上沒有經過任何壓縮。

  DIB的副檔名是.BMP或者.DIB

  與大多數位元影像格式不同的是,DIB從底部開始,水平向上掃描圖片。

  JPEG,GIF 是壓縮後的DIB。

 

二、位元影像操作:

  1,開啟位元影像

    hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
                         OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;

  2,讀取位元影像

    dwFileSize = GetFileSize (hFile, &dwHighSize) ;

    pbmfh = malloc (dwFileSize) ;

    ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;

  3,讀取位元影像資訊

       static BITMAPINFO       * pbmi ;
       static BYTE             * pBits ;

    pbmi  = (BITMAPINFO *) (pbmfh + 1) ;
        pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ;

    if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
               {
                    cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
                    cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
               }
               else
               {
                    cxDib =      pbmi->bmiHeader.biWidth ;
                    cyDib = abs (pbmi->bmiHeader.biHeight) ;
               }

  4,顯示位元影像:

    SetDIBitsToDevice (hdc,
                                  100,         // xDst
                                  100,         // yDst
                                  cxDib,     // cxSrc
                                  cyDib,     // cySrc
                                  0,         // xSrc
                                  0,         // ySrc
                                  0,         // first scan line
                                  cyDib,     // number of scan lines
                                  pBits,
                                  pbmi,
                                  DIB_RGB_COLORS) ;

    SetDIBitsToDevice沒有掩碼參數

    如果位元影像過大,可以採取連續顯示方法,就是每次讀一行或幾行,然後SetDIBitsToDevice顯示出來,例子見seqdisp。

    StretchDIBits (hdc, 0, 0, cxClient, cyClient,
                                     0, 0, cxDib, cyDib,
                                pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;

    StretchDIBits和SetDIBitsToDevice的關係等同與Bitblt和StretchBlt的關係。但StretchDIBits有掩碼參數。

    另外StretchDIBits不能通過連續顯示節省記憶體。

  5,儲存位元影像

    hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL,
                         CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;

    WriteFile (hFile, pbmfh, pbmfh->bfSize, &dwBytesWritten, NULL) ;

 

 三、DIB和DDB轉化

  1,從DIB 到 DDB

   1.1 如上面,用ReadFile開啟DIB後,hBitmap = CreateDIBitmap (hdc, (BITMAPINFOHEADER *) (pbmfh + 1),CBM_INIT,
    (BYTE *) pbmfh + pbmfh->bfOffBits,(BITMAPINFO *) (pbmfh + 1),DIB_RGB_COLORS) ;

    如果CreateDIBitmap的時候沒有初始化像素位,可以用SetDIBits

   1.2 CreateDIBSection 建立位元影像的一部分:位元影像像素位的記憶體塊 bits

    建立的記憶體塊歸系統所有,傳輸速度快,能用指標直接改變DIB位。deleteobject(hbitmap)的時候系統自動釋放記憶體塊。

    步驟:同上,讀取pbmi後,

    CreateDIBSection (NULL, pbmi, DIB_RGB_COLORS, &pBits, NULL, 0) ;

    ReadFile (hFile, pBits, bmfh.bfSize - bmfh.bfOffBits, &dwBytesRead, NULL) ;

  2 從DDB到DIB

    GetDIBits

    但此方法一般不用,因為如果有HBITMAP控制代碼的話,一定會有建立這個控制代碼的資源。而DDB包含的資訊會比較少,所以不如直接從資源中儲存。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.