VC++中图像处理类CBitmap的用法

VC++中图像处理类CBitmap的用法

简介

CBitmap是MFC框架下的一个图像处理类,可以方便地进行图像的读取、处理和展示。它封装了基本的位图信息和位图文件的操作方法,可以很好地处理bmp、jpg、png等格式的图像。

CBitmap类的常用方法

1. 构造函数

CBitmap提供了多个构造函数,其中最常用的是默认构造函数CBitmap()和参数为位图资源ID的构造函数CBitmap(UINT nIDResource)。

例如:

CBitmap bmp;                            // 创建一个空指针
bmp.LoadBitmap(IDB_BITMAP1);            // 加载位图资源

2. 位图信息的获取

CBitmap提供了GetBitmap()方法用于获取位图信息。

例如:

BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);                // 获取位图信息
TRACE("bmp Width:%d, Height:%d", bmpInfo.bmWidth, bmpInfo.bmHeight);

3. 位图文件的加载

CBitmap提供了LoadBitmap()方法用于加载资源中的位图文件,也提供了LoadImage()方法用于加载磁盘上的位图文件。

例如:

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);            // 加载位图资源
HBITMAP hBmp = (HBITMAP)LoadImage(NULL, "C:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
bmp.Attach(hBmp);                       // 将位图文件附加到CBitmap对象

4. 位图的绘制

CBitmap提供了很多不同类型的Draw()方法用于在设备环境中绘制位图。

例如:

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);            // 加载位图资源

CDC *pDC = GetDC();
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);          // 创建和当前设备环境兼容的设备环境
dcMem.SelectObject(bmp);                // 选择当前的位图
pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMem, 0, 0, SRCCOPY);
ReleaseDC(pDC);

FreeDC(dcMem);

5. 位图文件的保存

CBitmap提供了SaveImage()方法用于将位图文件保存到磁盘上。

例如:

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);                    // 加载位图资源

BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);                        // 获取位图信息

CImage image;
image.Attach(bmp);
image.Save(_T("C:\\test.jpg"), Gdiplus::ImageFormatJPEG);

示例一:将位图文件转换成灰度图像

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);                    // 加载位图资源

BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);                        // 获取位图信息

int nWidth = bmpInfo.bmWidth;
int nHeight = bmpInfo.bmHeight;

CImage image;
image.Create(nWidth, nHeight, 8, 0);            // 创建一张8位深度的位图

CDC dc;
dc.CreateCompatibleDC(NULL);
dc.SelectObject(image);

dc.BitBlt(0, 0, nWidth, nHeight, &dc, 0, 0, SRCCOPY);   // 原图赋值到新位图中

for (int i = 0; i < nWidth; i++)
{
    for (int j = 0; j < nHeight; j++)
    {
        COLORREF color = dc.GetPixel(i, j);
        BYTE red = GetRValue(color);
        BYTE green = GetGValue(color);
        BYTE blue = GetBValue(color);
        BYTE gray = static_cast<BYTE>((red + green + blue) / 3.0);
        dc.SetPixel(i, j, RGB(gray, gray, gray));
    }
}

image.Save(_T("C:\\test_gray.bmp"), Gdiplus::ImageFormatBMP);

示例二:叠加一个png图像到jpg图像上

CImage image;
image.Load(_T("C:\\test.jpg"));         // 加载jpg图像

CImage image2;
image2.Load(_T("C:\\test.png"));        // 加载png图像

CDC dc;
dc.CreateCompatibleDC(NULL);
dc.SelectObject(image);

CDC dc2;
dc2.CreateCompatibleDC(NULL);
dc2.SelectObject(image2);

BITMAP bmpInfo;
image.GetBitmap(&bmpInfo);

BITMAPINFO bmp;
ZeroMemory(&bmp, sizeof(BITMAPINFO));
bmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmp.bmiHeader.biWidth = bmpInfo.bmWidth;
bmp.bmiHeader.biHeight = bmpInfo.bmHeight;
bmp.bmiHeader.biPlanes = 1;
bmp.bmiHeader.biBitCount = 24;
bmp.bmiHeader.biCompression = BI_RGB;

BYTE *pSrcData = NULL;
image2.GetBitmapBits(bmpInfo.bmWidthBytes * bmpInfo.bmHeight, pSrcData);

BYTE *pDestData = NULL;
image.GetBitmapBits(bmpInfo.bmWidthBytes * bmpInfo.bmHeight, pDestData);

for (int i = 0; i < bmpInfo.bmWidth; i++)
{
    for (int j = 0; j < bmpInfo.bmHeight; j++)
    {
        BYTE R, G, B;
        R = pDestData[(j * bmpInfo.bmWidth + i) * 3 + 2];
        G = pDestData[(j * bmpInfo.bmWidth + i) * 3 + 1];
        B = pDestData[(j * bmpInfo.bmWidth + i) * 3];

        BYTE alpha = pSrcData[(j * bmpInfo.bmWidth + i) * 4 + 3];

        BYTE R2, G2, B2;
        R2 = pSrcData[(j * bmpInfo.bmWidth + i) * 4 + 2];
        G2 = pSrcData[(j * bmpInfo.bmWidth + i) * 4 + 1];
        B2 = pSrcData[(j * bmpInfo.bmWidth + i) * 4];

        pDestData[(j * bmpInfo.bmWidth + i) * 3 + 2] = static_cast<BYTE>((R * (255 - alpha) + R2 * alpha) / 255.f);
        pDestData[(j * bmpInfo.bmWidth + i) * 3 + 1] = static_cast<BYTE>((G * (255 - alpha) + G2 * alpha) / 255.f);
        pDestData[(j * bmpInfo.bmWidth + i) * 3] = static_cast<BYTE>((B * (255 - alpha) + B2 * alpha) / 255.f);
    }
}

image.Save(_T("C:\\test_result.jpg"), Gdiplus::ImageFormatJPEG);

结语

本文简单介绍了CBitmap类的一些常用方法,并且给出了两个简单的示例,希望读者可以在实际应用中更好地掌握CBitmap类的用法。当然,本文仅仅提供了一些简单的例子,实际的图像处理过程可能更加复杂,需要考虑到文件格式、速度等一系列因素,需要读者自行进一步学习去研究。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VC++中图像处理类CBitmap的用法 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法

    实现打开默认浏览器登录人人和打开QQ的方法,需要用到Python的webbrowser和selenium库。 使用webbrowser库打开默认浏览器 webbrowser库提供了一个让Python程序控制本机默认浏览器的接口。可以使用它来打开特定URL、新建标签页或者窗口等操作。 示例1:打开人人网首页 import webbrowser url = &q…

    人工智能概论 2023年5月25日
    00
  • Ubuntu/Debian上安装Nginx+php环境详细教程

    下面是Ubuntu/Debian上安装Nginx+php环境的详细教程,教程包括以下步骤: 安装Nginx 在终端中执行以下命令安装Nginx: sudo apt-get update sudo apt-get install nginx -y 检查Nginx是否成功安装,在浏览器中输入以下网址: http://localhost/ 如果看到欢迎页面,则表示…

    人工智能概览 2023年5月25日
    00
  • 构建双vip的高可用MySQL集群

    构建双 VIP 的高可用 MySQL 集群 准备工作 安装 MySQL 数据库,选择适用于您操作系统的 MySQL 版本,并配置好相关的参数。可选使用 Percona Server 或 MariaDB 作为 MySQL 的替代品,二者均提供了更好的性能与可靠的特性。 安装 HAProxy,HAProxy 是一个开源的负载均衡器,它可以用来分发来自客户端的负载…

    人工智能概览 2023年5月25日
    00
  • Django使用HTTP协议向服务器传参方式小结

    下面是关于“Django使用HTTP协议向服务器传参方式小结”的详细讲解。 HTTP协议传参方式小结 在Django中,我们常常需要在HTTP请求中向服务器传递参数。这个参数可以是请求头、请求体或请求URL中的一部分。通常情况下,我们可以使用以下四种方式来传递参数: GET方法 GET方法是最简单的一种HTTP请求方法,它将请求参数放在URL的后面,形如/y…

    人工智能概览 2023年5月25日
    00
  • Python道路车道线检测的实现

    以下是Python道路车道线检测的实现攻略: 1. 准备工作 首先, 我们需要安装一些必要的Python库,如 numpy, cv2和 matplotlib。可以按照以下命令来安装这些库。 !pip install numpy !pip install opencv-python !pip install matplotlib 2. 读取图像文件 接下来,我…

    人工智能概论 2023年5月25日
    00
  • 新手必备Python开发环境搭建教程

    新手必备Python开发环境搭建教程 简介 Python是一门非常流行的编程语言,在多数领域都有广泛的应用。Python的优势在于语法简洁明了,易于学习,同时也有非常强大的开源社区支持。在开始Python编程之前,需要先搭建Python的开发环境。本文将介绍如何在Windows和macOS系统中搭建Python开发环境。 Windows系统 下载Python…

    人工智能概览 2023年5月25日
    00
  • 树莓派升级python的具体步骤

    以下是树莓派升级Python的详细步骤: 1.备份 在升级前,我们需要备份目前系统中使用的Python环境和安装的第三方库。首先,在Terminal中输入以下命令以备份: sudo pip freeze > requirements.txt 这个命令会将当前安装的所有第三方库以及其版本号保存在一个名为”requirements.txt”的文件中。 接下…

    人工智能概览 2023年5月25日
    00
  • Python开发之基于模板匹配的信用卡数字识别功能

    Python开发之基于模板匹配的信用卡数字识别功能 1. 概述 本攻略讲解的是如何开发一个基于模板匹配的信用卡数字识别功能,该功能可以自动识别一张信用卡的卡号,并且将卡号中的数字提取出来进行展示。 2. 开发流程 2.1 数据采集和预处理 首先,需要准备一些信用卡的图片作为训练数据。可以从网上下载一些信用卡的图片,或者自己拍摄信用卡照片。图片要求同一尺寸,并…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部