1. 存储为HBITMAP类型的.bmp位图文件

参考:C++保存HBITMAP为位图文件的实现方法(IT技术) (qb5200.com)

ImageHelper.h 

#pragma once#include <windows.h>
#include <string>
using namespace std;class ImageHelper
{
public:static bool SaveBitmapToFile(HBITMAP bitmap, const string& filename); //保存位图到文件private:static WORD GetBitmapBitCount(); //计算位图文件每个像素所占字节数static void ProcessPalette(HBITMAP hBitmap, const BITMAP& bitmap,DWORD paletteSize, LPBITMAPINFOHEADER lpBmpInfoHeader); //处理调色板
};

ImageHelper.cpp

#include "ImageHelper.h"
#include <shlwapi.h>bool ImageHelper::SaveBitmapToFile(HBITMAP hBitmap, const string& filename)
{//1. 创建位图文件const auto file = CreateFileA(filename.c_str(), GENERIC_WRITE,0, nullptr, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,nullptr);if (file == INVALID_HANDLE_VALUE){return false;}//2. 计算位图文件每个像素所占字节数const auto bitCount = GetBitmapBitCount();//3. 获取位图结构BITMAP bitmap;::GetObject(hBitmap, sizeof(bitmap), reinterpret_cast<LPSTR>(&bitmap));//位图中像素字节大小(32字节对齐)const DWORD bmBitsSize = ((bitmap.bmWidth * bitCount + 31) / 32) * 4 * bitmap.bmHeight;//调色板大小const DWORD paletteSize = 0;//4. 构造位图信息头BITMAPINFOHEADER  bmpInfoHeader; //位图信息头结构bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);bmpInfoHeader.biWidth = bitmap.bmWidth;bmpInfoHeader.biHeight = bitmap.bmHeight;bmpInfoHeader.biPlanes = 1;bmpInfoHeader.biBitCount = bitCount;bmpInfoHeader.biCompression = BI_RGB;bmpInfoHeader.biSizeImage = 0;bmpInfoHeader.biXPelsPerMeter = 0;bmpInfoHeader.biYPelsPerMeter = 0;bmpInfoHeader.biClrImportant = 0;bmpInfoHeader.biClrUsed = 0;//5. 构造位图文件头BITMAPFILEHEADER bmpFileHeader;bmpFileHeader.bfType = 0x4D42; //"BM"//位图文件大小const DWORD dibSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + paletteSize + bmBitsSize;bmpFileHeader.bfSize = dibSize;bmpFileHeader.bfReserved1 = 0;bmpFileHeader.bfReserved2 = 0;bmpFileHeader.bfOffBits = static_cast<DWORD>(sizeof(BITMAPFILEHEADER))+ static_cast<DWORD>(sizeof(BITMAPINFOHEADER)) + paletteSize;//6. 为位图内容分配内存 const auto dib = GlobalAlloc(GHND, bmBitsSize + paletteSize + sizeof(BITMAPINFOHEADER)); //内存句柄const auto lpBmpInfoHeader = static_cast<LPBITMAPINFOHEADER>(GlobalLock(dib)); //指向位图信息头结构*lpBmpInfoHeader = bmpInfoHeader;//7. 处理调色板ProcessPalette(hBitmap, bitmap, paletteSize, lpBmpInfoHeader);//8. 写入文件DWORD written = 0; //写入文件字节数   WriteFile(file, reinterpret_cast<LPSTR>(&bmpFileHeader), sizeof(BITMAPFILEHEADER),&written, nullptr); //写入位图文件头WriteFile(file, reinterpret_cast<LPSTR>(lpBmpInfoHeader), dibSize,&written, nullptr); //写入位图文件其余内容//9. 清理资源GlobalUnlock(dib);GlobalFree(dib);CloseHandle(file);return true;
}//计算位图文件每个像素所占字节数
WORD ImageHelper::GetBitmapBitCount()
{const auto dc = ::CreateDCA("DISPLAY", nullptr, nullptr, nullptr);//当前分辨率下每像素所占字节数const auto bits = ::GetDeviceCaps(dc, BITSPIXEL) * GetDeviceCaps(dc, PLANES);::DeleteDC(dc);//位图中每像素所占字节数WORD bitCount;if (bits <= 1)bitCount = 1;else if (bits <= 4)bitCount = 4;else if (bits <= 8)bitCount = 8;elsebitCount = 24;return bitCount;
}//处理调色板
void ImageHelper::ProcessPalette(HBITMAP hBitmap, const BITMAP& bitmap,DWORD paletteSize, LPBITMAPINFOHEADER lpBmpInfoHeader)
{HANDLE oldPalette = nullptr;HDC dc = nullptr;const auto palette = GetStockObject(DEFAULT_PALETTE);if (palette != nullptr){dc = ::GetDC(nullptr);oldPalette = ::SelectPalette(dc, static_cast<HPALETTE>(palette), FALSE);::RealizePalette(dc); //实现设备调色板}//获取该调色板下新的像素值GetDIBits(dc, hBitmap, 0, static_cast<UINT>(bitmap.bmHeight),reinterpret_cast<LPSTR>(lpBmpInfoHeader) + sizeof(BITMAPINFOHEADER) + paletteSize,reinterpret_cast<BITMAPINFO*>(lpBmpInfoHeader), DIB_RGB_COLORS);//恢复调色板if (oldPalette != nullptr){::SelectPalette(dc, static_cast<HPALETTE>(oldPalette), TRUE);::RealizePalette(dc);::ReleaseDC(nullptr, dc);}
}

2. HBITMAP类型转存为JPEG类型

参考:Opencv Mat图像与HBITMAP互相转换

//大致示意HBITMAP bmp最终变成.jpg的图
void main(){Mat a ;HBitmap2Mat(bmp, a);imshow("result", a);imwrite("result.jpg", a);
}//HBitmap 转Mat
bool HBitmap2Mat(HBITMAP &hBmp, Mat &mat){BITMAP Bmp;GetObject(hBmp, sizeof(Bmp), &Bmp);int nChannels = Bmp.bmBitsPixel == 1 ? 1 : Bmp.bmBitsPixel / 8;int depth = Bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;Mat des_mat;des_mat.create(cvSize(Bmp.bmWidth, Bmp.bmHeight), CV_MAKETYPE(CV_8U, nChannels));GetBitmapBits(hBmp, Bmp.bmHeight*Bmp.bmWidth*nChannels, des_mat.data);mat = des_mat;return true;
}

C++ 处理HBITMAP类型的.bmp位图文件, 代码工具相关推荐

  1. 将HBITMAP转换成BMP位图文件的各个部分,可以在1BIT,4BIT,8BIT,16BIT,24BIT,32BIT之间转换

    VC将HBITMAP转换成BMP位图文件的各个部分,可以在1BIT,4BIT,8BIT,16BIT,24BIT,32BIT之间转换 http://blog.ednchina.com/wxleasyla ...

  2. 写入数据到bmp位图文件(C语言)

    在上一篇文章  读取bmp格式位图文件到二维数组(C语言)  中已经实现了读取24bits Bmp位图文件到二维数组的过程. 这次接着上一次的工作,试着用C语言将数据写入位图文件中. 基本原理和读取文 ...

  3. java bmp rgb数组_将RGB数据写入BMP位图文件

    CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString("E:\\94.bmp"), CFile::modeRead));//打开文件 ...

  4. 将RGB数据写入BMP位图文件

    <span style="font-size:18px;">CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString(&quo ...

  5. C语言读写bmp位图文件

    bitmap格式图片是未经压缩的,一般24bit位图(即一个像素点以24个二进制位表示). 分别用8个二进制位表示R/G/B三种颜色,这样一共可以表示256*256*256=16777216种颜色. ...

  6. BMP位图文件的4个组成部分

    bmp文件大体上分成四个部分. 位图文件头BITMAPFILEHEADER . 位图信息头BITMAPINFOHEADER . 调色板Palette . 实际的位图数据ImageDate 第1部分为位 ...

  7. 位图文件解析-位图(bmp)、图标(ico)与光标(cur)

    一.位图(bmp) 1.位图简介 BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广.它采用位映射存储格式 ...

  8. linux创建套接字文件类型,Linux日记---0X03文件类型

    文件类型 文件 文件是文件系统中存储数据的一个命名对象,文件是linux系统处理信息的基本单元,一个文件可以空文件,但空文件仍然为操作系统提供了其他信息,文件组成了linux的一切,linux将数据库 ...

  9. Visual C++ 2019中MFC图像处理编程(一) 位图文件的介绍

    Visual C++ 2019 中 MFC 图像处理编程(一) 1.1 位图文件及其C++操作 Windows操作系统中使用最多的图形文件格式就是位图格式,最常见的位图文件的扩展名为BMP.BMP是英 ...

最新文章

  1. pycharm怎么关联python_Python3 安装pylint 及与PyCharm关联
  2. 研究一下valueOf与toString方法
  3. 一次失败的尝试,h5+Api 结合 react,webpack,同时生成android 、ios、h5端代码
  4. 修改RAC VIP IP
  5. Hadoop权威指南 _03_第I部分Hadoop基础知识_第1章初识Hadoop.
  6. YOLOv5算法详解
  7. mpvue 小程序 页面跳转获取参数
  8. Java实例化后自动执行_Java的实例化顺序(程序执行顺序)
  9. Matlab中的逻辑运算与,||与|的区别
  10. 赋值pingfang(i)=x; 与或非
  11. react native 8081 端口号被占
  12. 微信小程序绑定手机号登录流程
  13. Java中停止线程的3种方式
  14. IT男潘加宇:老婆在孩子班级群里怒怼数学老师
  15. Excel :模拟投币实验
  16. python正则表达式编译_用Python编译正则表达式
  17. Android Studio 3.0 多渠道打包 解决All flavors must now belong to a named flavor dimension
  18. 哈夫曼树(模拟+哈夫曼树+最小WPL)
  19. PMP备考错题集-作业习题二
  20. yaml/yml语法

热门文章

  1. EXSI实现MPIO多路径
  2. 计算机硬盘系统的五个基本组成部分,计算机的五大组成部分
  3. 快速点击,多次请求同一接口,怎样让结果渲染为最后一次请求的结果
  4. Java并发包之闭锁/栅栏/信号量及并发模型和锁
  5. java中classpath_java中的classpath
  6. 安卓 sqlite数据存入mysql_详解Android数据存储—使用SQLite数据库
  7. python12306刷票脚本_python+splinter实现12306网站刷票并自动购票流程
  8. 电影是根据似动现象还是视觉暂留发明的?
  9. ModelSim使用技巧总结(入门向)
  10. python实训报告5000字_Python程序设计实验报告(一)