当前位置: 首页 > 编程笔记 >

C++针对bmp格式解析实例

朱锐
2023-03-14
本文向大家介绍C++针对bmp格式解析实例,包括了C++针对bmp格式解析实例的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C++针对bmp格式解析的方法,分享给大家供大家参考。具体方法如下:

写这代码时,容易出现如下错误:
1. 忘了on_wm_paint()  一直在界面上画不出来
2. 正确写法

BYTE* pBits = (BYTE*)lpBase + pbitmapFileHeader->bfOffBits; 

写成了 

BYTE* pBits =  pbitmapFileHeader->bfOffBits;

这里主要是用了前面一篇中的CWnd框架。

.cpp源文件如下:

#include "ReadBMP.h"  

#include "resource.h"  

#include <afxdlgs.h >  

  

CMyApp theApp;  

BOOL CMyApp::InitInstance()  

{  

    m_pMainWnd = new CMainWindow;  

    m_pMainWnd->ShowWindow(m_nCmdShow);  

    return TRUE; //必须返回TRUE,否则不会进入消息循环,界面会直接退出  

}  

  

//CMainWindow  

BEGIN_MESSAGE_MAP(CMainWindow, CWnd)  

ON_WM_CREATE()  

ON_WM_PAINT()  

ON_COMMAND(IDC_OPEN, OnOpen)  

END_MESSAGE_MAP()  

//构造函数  

CMainWindow::CMainWindow()  

{  

    LPCTSTR lpszClassName = ::AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, ::LoadCursorA(NULL, IDC_ARROW), (HBRUSH)(COLOR_3DFACE+1), theApp.LoadIcon(IDI_MAIN));  

    CreateEx(WS_EX_CLIENTEDGE, lpszClassName, "xxx", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL);  

}  

//析构函数  

CMainWindow::~CMainWindow()  

{  

  

}  

//消息映射函数  

int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)  

{  

    //OutputDebugString("oncreate");  

    CClientDC dc(this);  

    m_hMemDC = ::CreateCompatibleDC(dc);  

    m_nWidth = 0;  

    m_nHeight = 0;  

    //设置菜单  

    HMENU hMenu = ::LoadMenuA(theApp.m_hInstance, (LPCSTR)IDR_MENU);  

    ::SetMenu(m_hWnd, hMenu);  

    return 0;  

}  

  

void CMainWindow::OnNcDestroy( )  

{  

    delete this;  

}  

void CMainWindow::OnDestroy()  

{  

      

}  

void CMainWindow::OnPaint()  

{  

    CPaintDC dc(this);  

    ::BitBlt(dc, 0, 0, m_nWidth, m_nHeight, m_hMemDC, 0, 0, SRCCOPY);  

}  

void CMainWindow::OnOpen()  

{  

    CFileDialog dlg(TRUE);  

    if (IDOK != dlg.DoModal())  

    {  

        return;  

    }  

    HANDLE  hFile = ::CreateFile(dlg.GetPathName(), GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  

    if (INVALID_HANDLE_VALUE == hFile)  

    {  

        return;  

    }  

    HANDLE  hFileMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);  

    if (NULL == hFileMap)  

    {  

        return;  

    }  

    LPVOID lpBase = ::MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);  

    if (NULL == lpBase)  

    {  

        return;  

    }  

    //从头结构中取三个信息:1.bfOffBits位图数据在文件中的起始位置,2.m_nWidth图像的宽,3.m_nHeight图像的高  

    BITMAPFILEHEADER* pbitmapFileHeader;  

    BITMAPINFO* pbitmapInfo;  

    pbitmapFileHeader = (BITMAPFILEHEADER*)lpBase;  

    if (pbitmapFileHeader->bfType != MAKEWORD('B','M'))  

    {  

        MessageBox("not bmp");  

        ::UnmapViewOfFile(lpBase);  

        ::CloseHandle(hFileMap);  

        ::CloseHandle(hFile);  

    }  

    //DWORD bfOffBits = pbitmapFileHeader->bfOffBits;  

    BYTE* pBits = (BYTE*)lpBase + pbitmapFileHeader->bfOffBits;  

    pbitmapInfo = (BITMAPINFO*)((BYTE*)lpBase + sizeof(BITMAPFILEHEADER));  

    m_nWidth = pbitmapInfo->bmiHeader.biWidth;  

    m_nHeight = pbitmapInfo->bmiHeader.biHeight;  

    //显示BMP文件到内存设备  

    //得客户区DC  

    CClientDC dc(this);  

    //创建与客户区DC兼容的位图  

    HBITMAP hBitmap = ::CreateCompatibleBitmap(dc, m_nWidth, m_nHeight);  

    if (hBitmap == 0)  

    {  

        return;  

    }  

    //位图选入内存DC  

    ::SelectObject(m_hMemDC, hBitmap);  

  

    //图像数据放到建立的DC中  

    ::SetDIBitsToDevice(m_hMemDC, 0, 0, m_nWidth, m_nHeight, 0, 0, 0, m_nHeight, pBits, pbitmapInfo, DIB_RGB_COLORS);  

  

    ::InvalidateRect(m_hWnd, NULL, TRUE);  

    ::DeleteObject(hBitmap);  

  

    ::UnmapViewOfFile(lpBase);  

    ::CloseHandle(hFileMap);  

    ::CloseHandle(hFile);  

  

}

.h头文件如下:

#include <afxwin.h>  

  

class CMyApp:public CWinApp  

{  

public:  

    virtual BOOL InitInstance();  

};  

  

//CMainWindow  

class CMainWindow:public CWnd  

{  

public:  

    CMainWindow();  

    ~CMainWindow();  

  

protected:  

    HDC m_hMemDC; //与客户区兼容的内存DC句柄   

    UINT m_nWidth; //BMP的宽度  

    UINT m_nHeight; //BMP的高度  

      

    //消息映射  

    afx_msg void OnNcDestroy( );  

    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  

    afx_msg void OnDestroy( );  

    afx_msg void OnOpen();  

    afx_msg void OnPaint();  

    DECLARE_MESSAGE_MAP()  

};

希望本文所述对大家的C++程序设计有所帮助。

 类似资料:
  • 本文向大家介绍C语言实现对bmp格式图片打码,包括了C语言实现对bmp格式图片打码的使用技巧和注意事项,需要的朋友参考一下 相信大家看到上面的标题一定觉的是上面高大上的技术,其实很简单。 前提准备:一张bmp格式的图片,如果没有的话,可以用Windows的画图软件来才裁剪。设置像素大小为(1024,768); 程序原理:将图片读入数组,然后给数组的指定位置存入随机数,最后再写入文件,这样图片就相应

  • 本文向大家介绍C++指向函数的指针实例解析,包括了C++指向函数的指针实例解析的使用技巧和注意事项,需要的朋友参考一下 通常来说C++函数指针是指指向函数的指针,而非指向对象的指针。就像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。 定义: 赋值: fp=function; 调用 (*fp)(10,100); volatile的用法和作用: con

  • 跨平台的INI解析器:SimpleINI,支持section,读、写、各种value,遍历等。代码有注释. [Code4App.com]

  • 本文向大家介绍解析C++中指向对象的指针使用,包括了解析C++中指向对象的指针使用的使用技巧和注意事项,需要的朋友参考一下 C++指向对象的常指针 将指针变量声明为const型,这样指针值始终保持为其初值,不能改变。 如: 定义指向对象的常指针的一般形式为: 也可以在定义指针变量时使之初始化,如将上面第2, 3行合并为: 请注意,指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其

  • 本文向大家介绍C#实现json格式数据解析功能的方法详解,包括了C#实现json格式数据解析功能的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现json格式数据解析功能的方法。分享给大家供大家参考,具体如下: 来写写json的解析吧 首先添加web引用 System.Web.Extensions 路径 c:\Program Files (x86)\Reference As

  • 本文向大家介绍delphi实现将BMP格式图形转化为JPG格式图形的方法,包括了delphi实现将BMP格式图形转化为JPG格式图形的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了delphi实现将BMP格式图形转化为JPG格式图形的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Delphi程序设计有所帮助。