创建8位DIB并显示

2024-01-29 17:08
文章标签 显示 创建 dib

本文主要是介绍创建8位DIB并显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   做的一个项目由于系统是8位的,对于24位的DIB位图使用BitBlt函数的时候非常慢,在debug下测试对于2500*2500的图像,BitBlt函数用了大概4000-5000ms,非常的受不了,这里主要是由于系统是8位的,你创建的是24位的DIB,这时候用BitBlt函数的时候系统会做很多转换工作,所以速度就非常慢,解决办法就是直接创建8位的DIB来显示,和显示24位DIB最大的不同就是要把调色板信息加到位图文件头中:

 

LPBYTE lpBitmapInfo = NULL;
BITMAPINFOHEADER *lpBitmapHeader;
RGBQUAD *lpRgb;
int i;

lpBitmapInfo = (LPBYTE)new char[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) ];
if (lpBitmapInfo == NULL)  
return;
lpBitmapHeader = (BITMAPINFOHEADER *)lpBitmapInfo;
lpBitmapHeader->biSize = sizeof (BITMAPINFOHEADER) ;
lpBitmapHeader->biWidth = wnd_w ;
lpBitmapHeader->biHeight = -wnd_h ;
lpBitmapHeader->biPlanes = 1 ;
lpBitmapHeader->biBitCount = 8 ;
lpBitmapHeader->biCompression = BI_RGB ;

lpBitmapHeader->biSizeImage = wnd_w * wnd_h;
lpBitmapHeader->biXPelsPerMeter = 0 ;
lpBitmapHeader->biYPelsPerMeter = 0 ;
lpBitmapHeader->biClrUsed = 0 ;
lpBitmapHeader->biClrImportant = 0 ;

关于调色板的地方不用自己再去设置系统调色板,要直接再创建位图的时候加上去
lpRgb = (RGBQUAD *)(lpBitmapInfo + sizeof(BITMAPINFOHEADER));
for (i = 0; i < 256; i++) {
lpRgb->rgbBlue = i;
lpRgb->rgbGreen = i;
lpRgb->rgbRed = i;
lpRgb->rgbReserved = 0;
lpRgb++;
}

hbitmap=CreateDIBSection(dc.GetSafeHdc(),

(CONST BITMAPINFO *)lpBitmapInfo,
DIB_RGB_COLORS,  
//DIB_PAL_COLORS,
(void **)&rev_buff,  
  NULL,
0);

 

memcpy(rev_buff, g_pTempBuff, wnd_w*wnd_h);//g_pTempBuff中存放的是8位灰度值。

 dc.BitBlt(0, 0, wnd_w, wnd_h, &dcCompatible, 0, 0, SRCCOPY);

 

 

OK,这样BitBlt的时间在DEBUG下不超过500ms了。

转自:http://blog.csdn.net/bigapple88/article/details/5746956

这篇关于创建8位DIB并显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657601

相关文章

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal