bmp保存和imagelist读取

  代码整理。

bmp保存

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
bool SaveBitmapToFile(CBitmap* bitmap, LPSTR lpFileName)  
{              
    HBITMAP hBitmap;    // 为刚才的屏幕位图句柄  
    HDC hDC; //设备描述表    
    int iBits; //当前显示分辨率下每个像素所占字节数    
    WORD wBitCount; //位图中每个像素所占字节数    
    DWORD dwPaletteSize = 0, //定义调色板大小  
        dwBmBitsSize,  //位图中像素字节大小     
        dwDIBSize,   //位图文件大小  
        dwWritten;  //写入文件字节数  
    BITMAP Bitmap; //位图属性结构    
    BITMAPFILEHEADER bmfHdr; //位图文件头结构    
    BITMAPINFOHEADER bi; //位图信息头结构      
    LPBITMAPINFOHEADER lpbi; //指向位图信息头结构    
    HANDLE fh,   //定义文件  
        hDib,    //分配内存句柄  
        hPal,   //调色板句柄  
        hOldPal = NULL;  
      
    //计算位图文件每个像素所占字节数    
    hBitmap = (HBITMAP)*bitmap;    
    hDC = CreateDC("DISPLAY",NULL,NULL,NULL);    
    iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);    
    DeleteDC(hDC);  
      
    if (iBits <= 1)    
        wBitCount = 1;    
    else if (iBits <= 4)    
        wBitCount = 4;    
    else if (iBits <= 8)    
        wBitCount = 8;    
    else if (iBits <= 24)    
        wBitCount = 24;    
    else if (iBits <= 32)  
        wBitCount = 32;  
      
    //计算调色板大小    
    if (wBitCount <= 8)    
        dwPaletteSize = (1 << wBitCount) * sizeof (RGBQUAD);  
      
    //设置位图信息头结构    
    GetObject(hBitmap, sizeof (BITMAP), (LPSTR)&Bitmap);  
    bi.biSize = sizeof (BITMAPINFOHEADER);    
    bi.biWidth = Bitmap.bmWidth;    
    bi.biHeight = Bitmap.bmHeight;    
    bi.biPlanes = 1;      
    bi.biBitCount = wBitCount;    
    bi.biCompression = BI_RGB;    
    bi.biSizeImage = 0;    
    bi.biXPelsPerMeter = 0;    
    bi.biYPelsPerMeter = 0;    
    bi.biClrUsed = 0;    
    bi.biClrImportant = 0;    
      
    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31) / 32) * 4 * Bitmap.bmHeight;    
      
    //为位图内容分配内存    
    hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof (BITMAPINFOHEADER));    
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);    
    *lpbi = bi;  
      
    // 处理调色板         
    hPal = GetStockObject(DEFAULT_PALETTE);    
    if (hPal)    
    {    
        hDC = ::GetDC(NULL);      
        hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);    
        RealizePalette(hDC);  
    }    
      
    //   获取该调色板下新的像素值    
    GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,    
        (LPSTR)lpbi + sizeof (BITMAPINFOHEADER) + dwPaletteSize,  
        (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);    
      
    //恢复调色板       
    if (hOldPal)      
    {    
        SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);    
        RealizePalette(hDC);    
        ::ReleaseDC(NULL, hDC);  
    }    
      
    //创建位图文件              
    fh = CreateFile(lpFileName, GENERIC_WRITE,  
        0, NULL, CREATE_ALWAYS,  
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);    
      
    if (fh == INVALID_HANDLE_VALUE)  
        return FALSE;    
      
    //   设置位图文件头    
    bmfHdr.bfType = 0x4D42;     //   "BM"    
    dwDIBSize = sizeof (BITMAPFILEHEADER)       
        + sizeof (BITMAPINFOHEADER)    
        + dwPaletteSize + dwBmBitsSize;      
    bmfHdr.bfSize = dwDIBSize;    
    bmfHdr.bfReserved1 = 0;    
    bmfHdr.bfReserved2 = 0;    
    bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER)     
        + (DWORD)sizeof (BITMAPINFOHEADER)    
        + dwPaletteSize;      
      
    //   写入位图文件头    
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);    
      
    //   写入位图文件其余内容    
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize,  
        &dwWritten, NULL);  
      
    //清除            
    GlobalUnlock(hDib);    
    GlobalFree(hDib);    
    CloseHandle(fh);    
  
    return TRUE;      
}    

调用方法:SaveBitmapToFile(cbm, “1.bmp”);

imagelist读取bmp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void GetImage(CImageList& imglist, CBitmap& dist ,int num)
{
CClientDC dc(NULL);

IMAGEINFO ii;
imglist.GetImageInfo(num, &ii);

int nWidth = ii.rcImage.right - ii.rcImage.left;
int nHeight = ii.rcImage.bottom - ii.rcImage.top;

dist.CreateCompatibleBitmap(&dc, nWidth, nHeight);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = memDC.SelectObject(&dist);

memDC.FillSolidRect(0, 0, nWidth, nHeight, 
RGB(255,255,255) );

imglist.Draw(&memDC, num, CPoint(0, 0), ILD_NORMAL);

memDC.SelectObject(pOldBitmap);

memDC.DeleteDC();

::DeleteObject(ii.hbmImage);
::DeleteObject(ii.hbmMask);
}

代码整理自互联网。

Licensed under CC BY-NC-SA 4.0
最后更新于 0001-01-01 00:00 UTC
使用 Hugo 构建
主题 StackJimmy 设计