热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bitmap的mask操作

在进行图像的处理的时候,有时候需要进行图像的mask操作。以下是在windows程序设计第五版里面抄下来的。1LRESULTCALLBACKWndProc(HWNDhwnd,UIN

在进行图像的处理的时候,有时候需要进行图像的mask操作。

以下是在windows程序设计第五版里面抄下来的。

1 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
2 {
3 static HBITMAP hBitmapImag, hBitmapMask;
4 static HINSTANCE hInstance;
5 static int cxClient, cyClient, cxBitmap, cyBitmap;
6 BITMAP bitmap;
7 HDC hdc, hdcMemImag, hdcMemMask;
8 int x, y;
9 PAINTSTRUCT ps;
10
11 switch(message)
12 {
13 case WM_CREATE:
14 hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
15 // loadimg and get it's size
16 hBitmapImag = LoadBitmap(hInstance, TEXT("MATTHEW"));
17 GetObject(hBitmapImag, sizeof(bitmap), &bitmap);
18 cxBitmap = bitmap.bmWidth;
19 cyBitmap = bitmap.bmHeight;
20 // select the original image into a memory dc
21 hdcMemImag = CreateCompatibleDC(NULL);
22 SelectObject(hdcMemImag, hBitmapImag);
23 //create the monochrome mask bitmap and memory dc
24 hBitmapMask = CreateBitmap(cxBitmap, cyBitmap, 1, 1, NULL);
25 hdcMemMask = CreateCompatibleDC(NULL);
26 SelectObject(hdcMemMask, hBitmapMask);
27 //color the mask bitmap black with a white ellipse
28 SelectObject(hdcMemMask, GetStockObject(BLACK_BRUSH));
29 Rectangle(hdcMemMask, 0, 0, cxBitmap, cyBitmap);
30 SelectObject(hdcMemMask, GetStockObject(WHITE_BRUSH));
31 Ellipse(hdcMemMask, 0, 0, cxBitmap, cyBitmap);
32 // mask the original image
33 BitBlt(hdcMemImag, 0, 0, cxBitmap, cyBitmap, hdcMemMask, 0, 0, SRCAND);
34 DeleteDC(hdcMemImag);
35 DeleteDC(hdcMemMask);
36 return 0;
37 case WM_SIZE:
38 cxClient = LOWORD(lParam);
39 cyClient = HIWORD(lParam);
40 return 0;
41 case WM_PAINT:
42 hdc = BeginPaint(hwnd, &ps);
43 // select bitmaps into memory dcs
44 hdcMemImag = CreateCompatibleDC(hdc);
45 SelectObject(hdcMemImag, hBitmapImag);
46 hdcMemMask = CreateCompatibleDC(hdc);
47 SelectObject(hdcMemMask, hBitmapMask);
48 x = (cxClient - cxBitmap) / 2;
49 y = (cyClient - cyBitmap) / 2;
50 BitBlt(hdc, x, y, cxBitmap, cyBitmap, hdcMemMask, 0, 0, 0x220326);
51 BitBlt(hdc, x, y, cxBitmap, cyBitmap, hdcMemImag, 0, 0, SRCPAINT);
52
53 DeleteDC(hdcMemImag);
54 DeleteDC(hdcMemMask);
55 EndPaint(hwnd, &ps);
56 return 0;
57 case WM_DESTROY:
58 DeleteObject(hBitmapImag);
59 DeleteObject(hBitmapMask);
60 PostQuitMessage(0);
61 return 0;
62 }
63 return DefWindowProc(hwnd, message, wParam, lParam);
64 }

这里我一个错误就是第33行,我直接用srccopy进行操作,导致界面上没有任何的图像。应用了与的操作。

每个图的操作:1、获取图像句柄,可以通过loadbitmap的方式,也可以通过createbitmap的方式进行。等方式。2、创建内存的句柄,createcompatiabledc的方式来操作。3、将图像句柄关联到内存中。公国selectobject的方式如第22行所示。这样一个图像就相当于已经关联到了一个内存中。

通过BitBlt的方式,第33行所示,拷贝一个位图,从源设备复制到目标设备。这里通过按位与的方式来进行拷贝。也可通过简单的拷贝。只要最后一位参数由srcand改成srccopy即可。

在显示完成之后需要将dc释放掉。deletedc的方式。讲不需要的内存句柄释放掉。

这里,在第50行中,从原来的由边框位黑色,内部椭圆为白色变成内部椭圆为黑色,外部边框为黑色。这里是自定义的即:D&~S,将原来的进行与。

在第51行中,进行了D|S的方式。从而目标图像被原封不动的复制出来。在这里原封不动的原因是因为之前的那个源的外部是黑色,而目标的内部是白色。所以两个与之后产生的是黑色

在这里,selectobect得多看下的是:selects an object into the specified device context (DC). The new object replaces the previous object of the same type.



推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
author-avatar
516837745_d2d52c
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有