[原]将BITMAPINFO保存成bmp文件,以及渲染到设备

/*
        class Image
        {
        public:
            Image() = delete;
            Image(const uint32_t& _w, const uint32_t& _h)
                :w(_w), h(_h) {
                data = new byte[w*h * 4];
            };
            ~Image() { if (data) { delete[] data; } }
            uint32_t w;
            uint32_t h;
            byte* data;
        };
*/

        BITMAPINFO dib;
    memset(&dib, 0, sizeof(BITMAPINFO));
    dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    dib.bmiHeader.biWidth = image->w;
    dib.bmiHeader.biHeight =-(int) image->h;
    dib.bmiHeader.biPlanes = 1;
    dib.bmiHeader.biBitCount = 32;
    dib.bmiHeader.biCompression = BI_RGB;
    dib.bmiHeader.biSizeImage = image->w *  image->h * 4;

    BITMAPFILEHEADER fileHeader;
    fileHeader.bfType = 0x4d42; // BM
    fileHeader.bfReserved1 = 0;
    fileHeader.bfReserved2 = 0;
    fileHeader.bfSize = image->w * image->h * 4 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    CFile file;
    
//保存到文件
    if (file.Open("E:\\temp\\1.bmp", CFile::modeCreate | CFile::modeWrite))
    {
        file.Write(&fileHeader, sizeof(BITMAPFILEHEADER));
        file.Write(&dib.bmiHeader, sizeof(BITMAPINFOHEADER));
        file.Write(image->data, image->w * image->h * 4);
        file.Close();
    }

//渲染到设备
    SetDIBitsToDevice(this->GetDC()->GetSafeHdc(), 0, 0, image->w, image->h,
        0, 0, 0, image->h,
        image->data, &dib, DIB_RGB_COLORS);
    

    

 测试可行

参考:https://www.cnblogs.com/wangguchangqing/p/5432227.html

转载于:https://www.cnblogs.com/lyggqm/p/11126309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是将jpg图转换单色位图并保存图片的MFC代码实现: 1. 加载jpg图并创建位图对象 ```c++ CImage img; img.Load(_T("example.jpg")); // 加载jpg图 CBitmap bmp; bmp.Attach(img.Detach()); // 创建位图对象 ``` 2. 获取位图信息和像素数据 ```c++ BITMAP bmpInfo; bmp.GetBitmap(&bmpInfo); // 获取位图信息 int width = bmpInfo.bmWidth; int height = bmpInfo.bmHeight; BYTE* pPixels = new BYTE[bmpInfo.bmHeight * bmpInfo.bmWidthBytes]; bmp.GetBitmapBits(bmpInfo.bmHeight * bmpInfo.bmWidthBytes, pPixels); // 获取像素数据 ``` 3. 将像素数据转换单色位图数据 ```c++ BYTE* pMonoPixels = new BYTE[bmpInfo.bmHeight * bmpInfo.bmWidthBytes]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { BYTE* pPixel = &pPixels[row * bmpInfo.bmWidthBytes + col * 3]; BYTE r = pPixel[0]; BYTE g = pPixel[1]; BYTE b = pPixel[2]; // 灰度值计算公式 BYTE gray = (BYTE)(0.299 * r + 0.587 * g + 0.114 * b); // 将灰度值转换为单色位图数据 if (gray >= 128) pMonoPixels[row * bmpInfo.bmWidthBytes + col / 8] |= (0x80 >> (col % 8)); } } ``` 4. 创建单色位图对象并设置位图数据 ```c++ BITMAPINFOHEADER bih; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = width; bih.biHeight = height; bih.biPlanes = 1; bih.biBitCount = 1; bih.biCompression = BI_RGB; bih.biSizeImage = 0; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; BITMAPINFO bmi; bmi.bmiHeader = bih; CBitmap monoBmp; monoBmp.CreateBitmap(width, height, 1, 1, pMonoPixels); delete[] pPixels; delete[] pMonoPixels; ``` 5. 保存单色位图为bmp文件 ```c++ CImage monoImg; monoImg.Attach(monoBmp); monoImg.Save(_T("example_mono.bmp"), Gdiplus::ImageFormatBMP); ``` 完整代码: ```c++ CImage img; img.Load(_T("example.jpg")); // 加载jpg图 CBitmap bmp; bmp.Attach(img.Detach()); // 创建位图对象 BITMAP bmpInfo; bmp.GetBitmap(&bmpInfo); // 获取位图信息 int width = bmpInfo.bmWidth; int height = bmpInfo.bmHeight; BYTE* pPixels = new BYTE[bmpInfo.bmHeight * bmpInfo.bmWidthBytes]; bmp.GetBitmapBits(bmpInfo.bmHeight * bmpInfo.bmWidthBytes, pPixels); // 获取像素数据 BYTE* pMonoPixels = new BYTE[bmpInfo.bmHeight * bmpInfo.bmWidthBytes]; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { BYTE* pPixel = &pPixels[row * bmpInfo.bmWidthBytes + col * 3]; BYTE r = pPixel[0]; BYTE g = pPixel[1]; BYTE b = pPixel[2]; // 灰度值计算公式 BYTE gray = (BYTE)(0.299 * r + 0.587 * g + 0.114 * b); // 将灰度值转换为单色位图数据 if (gray >= 128) pMonoPixels[row * bmpInfo.bmWidthBytes + col / 8] |= (0x80 >> (col % 8)); } } BITMAPINFOHEADER bih; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = width; bih.biHeight = height; bih.biPlanes = 1; bih.biBitCount = 1; bih.biCompression = BI_RGB; bih.biSizeImage = 0; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; BITMAPINFO bmi; bmi.bmiHeader = bih; CBitmap monoBmp; monoBmp.CreateBitmap(width, height, 1, 1, pMonoPixels); delete[] pPixels; delete[] pMonoPixels; CImage monoImg; monoImg.Attach(monoBmp); monoImg.Save(_T("example_mono.bmp"), Gdiplus::ImageFormatBMP); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值