创建并保存位图

static void savetobmp(char * filename, BITMAPINFOHEADER* bmih, void * buffer, int lBufferLen)
{
    BITMAPFILEHEADER bmpFileHeader;
    ZeroMemory(&bmpFileHeader, sizeof(bmpFileHeader));
    bmpFileHeader.bfType = 'MB';
    bmpFileHeader.bfSize=sizeof(bmpFileHeader)+lBufferLen+sizeof(BITMAPINFOHEADER);
    bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

    FILE * fout = fopen(filename, "wb");
    fwrite(&bmpFileHeader, 1, sizeof(bmpFileHeader), fout);
    fwrite(bmih, 1, sizeof(*bmih), fout);
    fwrite(buffer, 1, lBufferLen, fout);
    fclose(fout);
}
static void CreateClockBitmap(const char * filename, int width, int height)
{
    HDC hDc = CreateCompatibleDC(NULL);//创建空的CDC

    BITMAPINFO bmpInfo; memset(&bmpInfo, 0, sizeof(bmpInfo));  //创建位图
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = (int)width;//宽度
    bmpInfo.bmiHeader.biHeight = (int)height;//高度
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biBitCount = 24; // 24bit色深
    bmpInfo.bmiHeader.biCompression = BI_RGB;

    void* pArray = NULL;
    HBITMAP hbmp = CreateDIBSection(NULL, &bmpInfo, DIB_RGB_COLORS, &pArray, NULL, 0);
    // 行对齐
    UINT uiTotalBytes = ((width * 24 + 31) & ~31)/8 * height;
    
    // 初始化成黑色
    memset(pArray, 0x00, uiTotalBytes);

    HBITMAP hOldBmp = (HBITMAP)SelectObject(hDc, hbmp); //选入位图
    
    // 设置字体
    HFONT hFont; LOGFONT lFont; memset(&lFont, 0, sizeof(LOGFONT)); 
    // 计算字体高度与磅值 
    int nNumerator = ::GetDeviceCaps(hDc, LOGPIXELSY); 
    lFont.lfHeight = ::MulDiv( 25, -nNumerator, 72); 
    lFont.lfWeight = 25; 
    // 创建字体 
    hFont = ::CreateFontIndirect(&lFont); 
    // 选择字体 
    HGDIOBJ hOldFont = ::SelectObject(hDc, hFont);

    RECT rc; rc.left = 0; rc.top = 0;
    rc.right = width; rc.bottom = height;
    char timestamp [100] = ""; 
    SYSTEMTIME st; GetLocalTime(&st); sprintf(timestamp, "%02hu:%02hu:%02hu", st.wHour, st.wMinute, st.wSecond);
    // 设置字体颜色
    SetTextColor(hDc, RGB(0xff, 0xFF, 0xFF));
    // 设置字体背景
    SetBkColor(hDc, RGB(0x00, 0x00, 0x00));
    // 绘制
    DrawTextA(hDc, timestamp, strlen(timestamp), &rc, DT_CENTER|DT_WORDBREAK);

    // 保存到文件
    savetobmp(filename, &bmpInfo.bmiHeader, pArray, uiTotalBytes);

    // 清理资源    
    SelectObject(hDc, hOldBmp);
    SelectObject(hDc, hOldFont);
    DeleteObject(hFont);
    DeleteObject(hbmp);
    DeleteDC(hDc);
    return ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
保存单色位图,可以使用CBitmap类的GetBitmapBits函数获取位图数据,然后使用CFile类将数据写入文件中。以下是保存单色位图的示例代码: ```c++ CBitmap bitmap; bitmap.LoadBitmap(IDB_MONO_BITMAP); // 加载单色位图资源 BITMAP bmpInfo; bitmap.GetBitmap(&bmpInfo); int dataSize = bmpInfo.bmWidthBytes * bmpInfo.bmHeight; BYTE* data = new BYTE[dataSize]; // 获取位图数据 bitmap.GetBitmapBits(dataSize, data); // 创建文件并写入位图数据 CFile file(_T("mono.bmp"), CFile::modeCreate | CFile::modeWrite); BITMAPFILEHEADER fileHeader; BITMAPINFOHEADER infoHeader; // 填充文件头和信息头 memset(&fileHeader, 0, sizeof(BITMAPFILEHEADER)); memset(&infoHeader, 0, sizeof(BITMAPINFOHEADER)); fileHeader.bfType = 0x4d42; fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dataSize; fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); infoHeader.biSize = sizeof(BITMAPINFOHEADER); infoHeader.biWidth = bmpInfo.bmWidth; infoHeader.biHeight = bmpInfo.bmHeight; infoHeader.biPlanes = 1; infoHeader.biBitCount = 1; infoHeader.biCompression = BI_RGB; infoHeader.biSizeImage = dataSize; // 写入文件头和信息头 file.Write(&fileHeader, sizeof(BITMAPFILEHEADER)); file.Write(&infoHeader, sizeof(BITMAPINFOHEADER)); // 写入位图数据 file.Write(data, dataSize); // 释放内存 delete[] data; ``` 在上述示例代码中,首先使用GetBitmapBits函数获取位图数据,然后创建文件并填充文件头和信息头,最后将位图数据写入文件中。请注意,单色位图的每个像素只有1位,因此每行像素的字节数都是bmpInfo.bmWidthBytes,而不是bmpInfo.bmWidth * 4(32位位图的像素占4个字节)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值